题目链接:点击打开链接
题意:给n个数,不重复的挑选4个让和为0
题解:暴力找绝对时间超限。那么考虑优化。
a+b+c+d = 0;
a+b = -(c+d);
我们可以把数分成正数集合和负数集合,然后分别在两个集合中各自两两求和。然后得到新的数组res1,和 res2 分别表示,在正数中任挑两个和在负数中任挑两个,然后分别排序,遍历其中一个,然后二分找另外一个数组是否有这个值。
不过会有特殊,情况,就是只有正数,或者只有负数,只有一个正数,只有一个负数,或者四个0.
一 一特判。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn = 1e5+5;
int a[maxn],b[maxn];
int res1[maxn],res2[maxn];
int abs(int x){
return x <= 0 ? -x : x;
}
int bsearch(int* A,int x,int y,int v){
int m ;
while(x < y ){
m = x+(y-x)/2;
if(A[m] == v) return m;
else if(A[m] > v) y =m;
else x = m+1;
}
return -1;
}
int main(){
int n;
scanf("%d",&n);
int x;
int num1 = 0 ;
int num2 = 0;
for(int i = 0 ; i < n ; i ++){
scanf("%d",&x);
if(x < 0)
a[num1++] = x;
else
b[num2++] = x;
}
int cur1 = 0 ;
for(int i = 0 ; i < num1 ; i ++){
for(int j = i + 1; j < num1 ; j ++){
res1[cur1++] = abs(a[i]+a[j]);
}
}
int cur2 = 0;
for(int i = 0 ; i < num2 ; i ++){
for(int j = i + 1; j < num2 ; j ++){
res2[cur2++] = b[i]+b[j];
}
}
// cout << cur1 << cur2<< endl;
if(num1 == 1){
for(int i = 0 ; i < num2 ; i ++){
for(int j = i+1 ; j < num2 ;j ++){
for(int k = k + 1; k < num2 ;k ++){
if(a[0] + b[i] + b[j] + b[k] == 0){
printf("Yes\n");
return 0;
}
}
}
}
cout << "No" << endl;
return 0;
}
if(num2 == 1){
for(int i = 0 ; i < num1 ; i ++){
for(int j = i+1 ; j < num1 ;j ++){
for(int k = k + 1; k < num1 ;k ++){
if(b[0] + a[i] + a[j] + a[k] == 0){
printf("Yes\n");
return 0;
}
}
}
}
cout << "No" << endl;
return 0;
}
if(cur1 == 0){
int zxc = 0;
for(int i = 0 ; i < cur2 ; i ++){
if(res2[i] == 0)
zxc++;
}
if(zxc >= 4){
cout << "Yes" << endl;
}
else {
cout <<"No" << endl;
}
return 0;
}
// for(int i = 0 ; i < cur1 ; i ++){
// cout << res1[i] << " ";
// }
// cout << endl;
// for(int i = 0 ; i < cur2 ; i ++){
// cout << res2[i] << " ";
// }
// cout << endl;
sort(res1,res1+cur1);
sort(res2,res2+cur2);
int flag = 1;
for(int i = 0 ; i < cur1 ; i ++){
if(bsearch(res2,0,cur2,res1[i]) >= 0){
//cout << res1[i] << endl;
flag = 0;
break;
}
}
if(flag == 0)
cout <<"Yes" << endl;
else
cout << "No" << endl;
}