当前位置: 代码迷 >> 综合 >> 51Nod - 1267
  详细解决方案

51Nod - 1267

热度:29   发布时间:2023-11-20 06:09:08.0
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。Input第1行,1个数N,N为数组的长度(4 <= N <= 1000) 
第2 - N + 1行:A ii(-10^9 <= A ii <= 10^9)Output如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。Sample Input
5
-1
1
-5
2
4
Sample Output
Yes
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1005;
struct Node
{int x,y,s;
}sum[maxn*maxn];
bool cmp(Node x,Node y)
{return x.s < y.s;
}
int a[maxn];
int main()
{int N,count=0,flag=0;cin>>N;for(int i=0;i<N;i++) scanf("%d",&a[i]);for(int i=0;i<N-1;i++)for(int j=i+1;j<N;j++){sum[count].x=i;sum[count].y=j;sum[count++].s=a[i]+a[j];}sort(sum,sum+count,cmp);for(int i=0;i<count;i++){int L=0,R=count-1,key=-sum[i].s,mid=(L+R)/2;while(L<=R){if(key<sum[mid].s) R=mid-1;else if(key>sum[mid].s) L=mid+1;else if(key==sum[mid].s){if(sum[i].x!=sum[mid].x&&sum[i].y!=sum[mid].y&&sum[i].x!=sum[mid].y&&sum[i].y!=sum[mid].x){flag=1;}break;}mid=(L+R)/2;}if(flag){break;}}if(flag){cout<<"Yes";}else{cout<<"No";}}