二分查找

来源:互联网 发布:工程造价软件广联达 编辑:程序博客网 时间:2024/06/06 02:46

给出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

5-11-524
Sample Output

Yes

#include<iostream>#include<algorithm>using namespace std;struct q{int x,y,sum;}a[1000005];int cmp(struct q a,struct q b){return a.sum<b.sum;}int num[1005];int main(){int n,k=0,i,j;cin>>n;for(i=1;i<=n;i++)cin>>num[i];for(i=1;i<=n;i++){for(j=1;j<i;j++){a[k].x=i;a[k].y=j;a[k++].sum=num[i]+num[j];}}sort(a,a+k,cmp);i=0,j=k-1;while(i<=j){if(a[i].sum+a[j].sum==0){if(a[i].x!=a[j].x&&a[i].x!=a[j].y&&a[i].y!=a[j].x&&a[i].y!=a[j].y){printf("Yes\n");return 0;}if(a[i].sum==a[i+1].sum)i++;else if(a[j].sum==a[j-1].sum)j--;elsei++,j--;}else if(a[i].sum+a[j].sum<0)i++;else j--;}printf("No\n");return 0;}