51 nod 1267 4个数和为0

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
 收藏
 取消关注
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
Input
第1行,1个数N,N为数组的长度(4 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
Output
如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。
Input示例
5
-1
1
-5
2
4
Output示例
Yes

刚开始使用算出两个数的和然后保存在数组中,将4sum将为2sum,因为在算两个数的和的时候,可能存在重复的情况,所以用if语句判断了一下

#include<stdio.h>
#include<algorithm>
#include<string.h>
const int M = 1000005;

using namespace std;

typedef pair<int, int> P;

int main()
{
    int n, Count, flage;
    int i, j;
    int b[M], a[M];
    P p[M];

    scanf("%d", &n);

    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));

    for( i = 0; i < n; i++ )
    {
        scanf("%d", &a[i]);
    }

    Count = 0;

    for( i = 0; i < n; i++ )
    {
        p[Count].first = a[i];

        for( j = i+1; j < n; j++)
        {
            p[Count].second = a[j];
            b[Count++] = a[i] + a[j];
        }
    }

    for( i = 0; i < Count; i++ )
    {
        for( j = 0; j < Count; j++ )
        {
            if(p[i].first != p[j].first && p[i].second !=p[j].second && p[i].first != p[j].second && p[i].second != p[j].first)
            {
                flage = b[i] + b[j];

                if(flage == 0)
                {
                    printf("Yes
");

                    return 0;
                }
            }

        }
    }

    printf("No
");

    return 0;
}
View Code

结果提交的时候过了一半的数据,另外的一半被卡住了

Ac代码

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 5;
 
int n, num[MAXN];
 
int main(){
    freopen("in.txt", "r", stdin);
 
    int flag, tmp;
    while(scanf("%d", &n) != EOF){
        for(int i=0; i<n; ++i){
            scanf("%d", &num[i]);
        }
        sort(num+0, num+n);
        flag = 0;
        for(int i=0; i<n; ++i){
            if(flag){ break; }
            for(int j=i+1; j<n; ++j){
                if(flag){ break; }
                int l = j+1, r = n-1;
                while(l < r){
                    tmp = num[i] + num[j] + num[l] + num[r];
                    if(tmp == 0){
                        flag = 1;
                        break;
                    }else if(tmp > 0){
                        r--;
                    }else{
                        l++;
                    }
                }
            }
        }
        if(flag){
            printf("Yes
");
        }else{
            printf("No
");
        }
    }
    return 0;
}
View Code
永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/8213318.html