给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
第2 - N + 1行:A i (-10^9 <= A i
5 -1 1 -5 2 4
Yes
题解:先把任意的两个数相加放入一个数组中,排序,二分查找知否存在有值与他相反。(注意不能取两个数中有重复的值)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1010;
int k[M];
int n,ll;
struct sr
{
int l;int r;int n;//l,r 记录是那两个数的和
}kk[M*M];
bool cmp(sr a,sr b)
{
return a.n<b.n;
}
bool solve(int m,int i,int j)
{
int l=0,r=ll;
m=-m;
while(r-l>=1)
{
int mid=(l+r)/2;
if(kk[mid].n==m)
{
//四个数不能重复,判断是否有重合的值
if((kk[mid].l!=i)&&(kk[mid].l!=j)&&(kk[mid].r!=i)&&(kk[mid].r!=j))
return true;
else
return false;
}
else
if(kk[mid].n>m)
r=mid-1;
else
if(kk[mid].n<m)
l=mid+1;
}
return false;
}
int main()
{
int f;
while(~scanf("%d",&n))
{
ll=0;f=0;
for(int i=0;i<n;i++)
scanf("%d",&k[i]);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
kk[ll].l=i;
kk[ll].r=j;
kk[ll++].n=k[i]+k[j];
}
sort(kk,kk+ll,cmp);
for(int i=0;i<ll;i++)
{
if(solve(kk[i].n,kk[i].l,kk[i].r))
{
f=1;
break;
}
}
if(f==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}