题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267
题目:
给出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"。
先压缩成两个数相加,然后排序用二分查找即可,注意判断四个不同的数。
#include <iostream>
#include<bits/stdc++.h>
#define N 1100
using namespace std;
struct node
{
int x,y,num;
}d[N*N];
int m,a[N];
bool cmp(node a,node b)
{
return a.num<b.num;
}
int _find(int t,int x,int y)
{
int l=0,r=m-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(d[mid].num==t)
{
int c=0;
while((d[mid+c].num==t)||(d[mid-c].num==t))
{
if(d[mid+c].num==t)
if(d[mid+c].x!=x&&d[mid+c].y!=y&&d[mid+c].x!=y&&d[mid+c].y!=x) return 1;
if(d[mid-c].num==t)
if(d[mid-c].x!=x&&d[mid-c].y!=y&&d[mid-c].x!=y&&d[mid-c].y!=x) return 1;
c++;
}
return 0;
}
if(d[mid].num>t) r=mid-1;
else l=mid+1;
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
m=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
d[m].num=a[i]+a[j];
d[m].x=i;
d[m++].y=j;
}
sort(d,d+m,cmp);//for(int i=0;i<m;i++) cout<<d[i].num<<" "<<d[i].x<<" "<<d[i].y<<endl;
int flag=1;
for(int i=0;i<=m/2;i++)
{
if(_find(-d[i].num,d[i].x,d[i].y))
{
flag=0;
cout<<"Yes"<<endl;
break;
}
}
if(flag) cout<<"No"<<endl;
}