51Nod - 1267

给出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
-1
1
-5
2
4
Sample Output
Yes
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1005;
struct Node
{
 int x,y,s;
}sum[maxn*maxn];
bool cmp(Node x,Node y)
{
        return x.s < y.s;
}
int a[maxn];
int main()
{
        int N,count=0,flag=0;
        cin>>N;
        for(int i=0;i<N;i++) scanf("%d",&a[i]);

          for(int i=0;i<N-1;i++)
            for(int j=i+1;j<N;j++)
              {
                sum[count].x=i;
                sum[count].y=j;
                sum[count++].s=a[i]+a[j];
              }
              sort(sum,sum+count,cmp);
              for(int i=0;i<count;i++)
              {
                      int L=0,R=count-1,key=-sum[i].s,mid=(L+R)/2;
                      while(L<=R)
                      {
                              if(key<sum[mid].s) R=mid-1;
                              else if(key>sum[mid].s) L=mid+1;
                              else if(key==sum[mid].s)
                              {
                                      if(sum[i].x!=sum[mid].x&&sum[i].y!=sum[mid].y&&sum[i].x!=sum[mid].y&&sum[i].y!=sum[mid].x)
                                      {
                                              flag=1;
                                             
                                      }
                                       break;
                              }
                              mid=(L+R)/2;
                      }
                      if(flag)
                      {

                               break;
                      }
              }
              if(flag)
              {
                      cout<<"Yes";
              }
              else
                {
                        cout<<"No";
                }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值