51nod 1267 4个数和为0
二分的另一种形式
将两两数相加得到数组,存在b[i]+b[j] = 0,并且他们俩俩数不能相同。
我还真不知道这也叫二分法,从两边开始查找,合并的两边值相加答案渐渐接近0【应该说在0左右晃动】。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define E 2.71828
#define MOD 1000000007
#define N 1000100
struct Sum
{
int x,y;
long long sum;
}b[N];
bool cmp(Sum a, Sum b)
{
return a.sum < b.sum;
}
int a[1010];
int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
int k =0;
for(int i = 0; i < n; i++)
{
for(int j = i+1; j < n; j++)
{
b[k].x = i;
b[k].y = j;
b[k++].sum = a[i]+a[j];
}
}
sort(b,b+k,cmp);
int i = 0, j = k-1;
int flag = 0;
while(i < j)
{
if(b[i].sum+b[j].sum == 0)
{
if(b[i].x!=b[j].x && b[i].y!=b[j].y && b[i].x!=b[j].y && b[i].y!=b[j].x)
{
flag = 1;
break;
}
else
{
i++;
j--;
}
}
else if(b[i].sum+b[j].sum < 0)
i++;
else
j--;
}
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}