51 nod 1267 4个数和为0

给出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"。
Sample Input
5
-1
1
-5
2
4
Sample Output
Yes

  题解:先把任意的两个数相加放入一个数组中,排序,二分查找知否存在有值与他相反。(注意不能取两个数中有重复的值)

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1010;
int k[M];
int n,ll;
struct sr
{
    int l;int r;int n;//l,r 记录是那两个数的和
}kk[M*M];
bool cmp(sr a,sr b)
{
    return a.n<b.n;
}
bool solve(int m,int i,int j)
{
    int l=0,r=ll;
    m=-m;
    while(r-l>=1)
    {
        int mid=(l+r)/2;
        if(kk[mid].n==m)
        {
            //四个数不能重复,判断是否有重合的值
            if((kk[mid].l!=i)&&(kk[mid].l!=j)&&(kk[mid].r!=i)&&(kk[mid].r!=j))
             return true;
             else
                return false;
        }
        else
        if(kk[mid].n>m)
        r=mid-1;
        else
            if(kk[mid].n<m)
            l=mid+1;
    }
    return false;
}
int main()
{
    int f;
    while(~scanf("%d",&n))
    {
        ll=0;f=0;
        for(int i=0;i<n;i++)
            scanf("%d",&k[i]);
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
            {
                kk[ll].l=i;
                kk[ll].r=j;
                kk[ll++].n=k[i]+k[j];
            }
        sort(kk,kk+ll,cmp);
        for(int i=0;i<ll;i++)
        {
            if(solve(kk[i].n,kk[i].l,kk[i].r))
            {
                f=1;
                break;
            }
        }
        if(f==1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值