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;
}