zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    [Abp vNext微服务实践]
    [Abp vNext微服务实践]
    开源项目
    ORA-28002: x天之后口令将过期
    Linux压缩和解压
    cortex-m3内核的芯片截图,以及内核学习
    lpc1768的时钟树梳理和小结
    lp17xx的iap的向量表区别
    关于core_cm3.c和core_cm3.h,Core_cmFunc.h 和 Core_cmInstr.h的理解
    Python从json中提取数据
  • 原文地址:https://www.cnblogs.com/h-hkai/p/8213318.html
Copyright © 2011-2022 走看看