51nod 1267【二分】

思路:
首先我们能够很容易地想到,4个数的和,拆成两两相加:a+b=-c-d;
我们也能很轻松地求出两两之和,但是呢。。不同的和会存在相同的值相加,所以还要排除这个条件。具体操作就是标记一下,然后将和二分来操做

#include <stdio.h>
#include <map>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;

const int N=1e3+10;

int a[N];
struct asd{
    int x,y;
    int sum;
};
asd q[N*N];
int n;

bool cmp(asd s1,asd s2)
{
    return s1.sum<s2.sum;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int num=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            q[num].x=i;q[num].y=j;
            q[num++].sum=a[i]+a[j];
        }
    }
    sort(q,q+num,cmp);
    int s,t;
    s=0;
    t=num-1;
    while(s<num)
    {
        if(q[s].sum+q[t].sum==0)
        {
            if(q[s].x!=q[t].x&&q[s].x!=q[t].y&&q[s].y!=q[t].x&&q[s].y!=q[t].y)
            {
                printf("Yes\n");
                return 0;
            }
            if(q[s].sum==q[s+1].sum)
                s++;
            else if(q[t].sum==q[t-1].sum)
                t--;
            else
            {
                s++;
                t--;
            }
        }
        else if(q[s].sum+q[t].sum<0)
            s++;
        else
            t--;
    }
    printf("No\n");
    return 0;
}

posted @ 2016-09-02 17:10  see_you_later  阅读(112)  评论(0编辑  收藏  举报