给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。Input第1行,1个数N,N为数组的长度(4 <= N <= 1000)
第2 - N + 1行:Aii(-10^9 <= Aii <= 10^9)Output如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。Sample Input
第2 - N + 1行:Aii(-10^9 <= Aii <= 10^9)Output如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。Sample Input
5 -1 1 -5 2 4Sample 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";
}
}