首页 > 代码库 > 1267 4个数和为0

1267 4个数和为0

1267 4个数和为0
基准时间限制:1 秒 空间限制:131072 KB 分值: 20
给出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-11-524
Output示例
Yes
思路:二分+折半枚举;注意不能用任何一个重复的点。
 1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<math.h> 7 #include<set> 8 #include<vector> 9 #include<string.h>10 using namespace std;11 typedef long long LL;12 typedef struct node13 {14     int x;15     int y;16     LL sum;17 } ss;18 ss ans[1000005];19 LL ak[1005];20 bool check(int cn,int x);21 bool cmp(node p, node q)22 {23     return p.sum<q.sum;24 }25 int main(void)26 {27     int N;28     scanf("%d",&N);29     int i,j;30     for(i = 0; i < N; i++)31     {32         scanf("%lld",&ak[i]);33     }34     int cn = 0;35     for(i = 0; i < N ; i++)36     {37         for(j = i+1; j < N; j++)38         {39             ans[cn].x = i;40             ans[cn].y = j;41             ans[cn].sum = ak[i] + ak[j];42             cn++;43         }44     }45     sort(ans,ans+cn,cmp); bool flag =false;46     for(i = 0;i < cn ;i++)47     {48         flag = check(cn,i);49         if(flag)break;50     }51     if(flag)printf("Yes\n");52     else printf("No\n");53     return 0;54 }55 bool check(int cn,int x)56 {57     int l = 0;58     int r = cn -1;59     int id = -1;60     while(l <= r)61     {  int mid = (l+r)/2;62       if(ans[mid].sum <= -ans[x].sum)63       {64           id = mid;65           l = mid+1;66       }67       else r = mid-1;68     }69     int cp = -1;70     l = 0; r = cn-1;71     while(l <= r)72     {73         int mid = (l+r)/2;74         if(ans[mid].sum >= -ans[x].sum)75         {76             cp = mid;77             r = mid-1;78         }79         else l = mid+1;80     }81     if(cp !=-1&&id !=-1)82     {83         for(int i = cp ;i <= id;i++)84         {85             if(ans[i].x!=ans[x].x&&ans[i].y!=ans[x].x&&ans[x].y!=ans[i].x&&ans[x].y!=ans[i].y)86             {   87                 return true;88             }89         }90     }91     return false;92 }

 

1267 4个数和为0