给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
收起
输入
第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
输出
如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。
输入样例
5 -1 1 -5 2 4
输出样例
Yes
先预处理出两个数的和,再利用二分思想,求出最终答案。
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int x,y,v;
}no[1001*1002];
bool cmp(const Node &a,const Node &b)
{
return a.v<b.v;
}
bool check(int i,int j)
{
if(no[i].x!=no[j].x&&no[i].x!=no[j].y&&no[i].y!=no[j].x&&no[i].y!=no[j].y)
return true;
return false;
}
int main()
{
int n;
cin>>n;
int a[1006];
int tot=0;
for(int i=1;i<=n;i++)
{
int d;
cin>>d;
a[++tot]=d;
}
int num=0;
for(int i=1;i<=tot;i++)
{
for(int j=1;j<=tot;j++)
{
if(i==j)continue;
no[++num].x=i;
no[num].y=j;
no[num].v=a[i]+a[j];
}
}
sort(no+1,no+num+1,cmp);
int l=1;int r=num;
bool flag=0;
while(l<=r)
{
if(no[l].v+no[r].v>0)
r--;
else if(no[l].v+no[r].v<0)
l++;
else if(check(l,r)&&no[l].v+no[r].v==0)
{
flag=1;
cout<<"Yes"<<endl;
break;
}else
{
l++,r--;
}
}
if(!flag)
cout<<"No"<<endl;
return 0;
}