给出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 -1 1 -5 2 4
Output示例
Yes
开始从基础开始做,做了一个两个数的和为0,简单。做了一个3个数和为零。现在做4个数的和为0,拿着我就懵咯
还是思维不够敏捷哈。
让他们两两合并,瞬间就转换成了求两个数和为零了,但是此时是要判断一下,看合成的两个数中有没有相同的数。
另外再查找的时候二分一下。
#include<bits/stdc++.h>//转化成了两两的和
using namespace std;
const int maxn=1005;
int num[maxn];
struct node
{
int x;
int y;
int sum;
} a[maxn*maxn];
bool cmp(node aa,node bb)
{
if(aa.sum<bb.sum)
return true;
return false;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int len=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&num[i]);
for(int j=1; j<i; j++)
{
a[len].x=i;
a[len].y=j;
a[len++].sum=num[i]+num[j];
}
}
sort(a,a+len,cmp);
bool flag=true;
int l=0;
int r=len-1;
while(l<r)
{
if(a[l].sum+a[r].sum==0)
{
if(a[l].x!=a[r].x&&a[l].x!=a[r].y&&a[l].y!=a[r].x&&a[l].y!=a[r].y)
{
flag=false;
break;
}
if(a[l].sum==a[l+1].sum)
l++;
else if(a[r].sum==a[r-1].sum)
r--;
else
{
l++;
r--;
}
}
else if(a[l].sum+a[r].sum<0)
l++;
else
r--;
}
if(flag==false)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}