1267 4个数和为0
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注
给出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”。
Input示例
5
-1
1
-5
2
4
Output示例
Yes
#include <bits/stdc++.h>
using namespace std;
int a[1234];
struct node{
int x,y;
int sum;
bool operator < (const node& a) const{
return sum<a.sum;
}
}b[1234*1234];
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=0;j<i;j++){
b[k].x=i;
b[k].y=j;
b[k++].sum=a[i]+a[j];
}
}
sort(b,b+k);
int l=0,r=k-1;
bool ok=false;
while(l<=r){
if(b[l].sum+b[r].sum==0){
if(b[l].x!=b[r].x&&b[l].x!=b[r].y&&b[l].y!=b[r].x&&b[l].y!=b[r].y){
ok=true;
break;
} else if(b[l].sum==b[l+1].sum){
l++;
} else if(b[r].sum==b[r-1].sum){
r--;
} else {
l++;
r--;
}
} else if(b[l].sum+b[r].sum<0){
l++;
} else if(b[l].sum+b[r].sum>0) {
r--;
}
}
if(ok){
puts("Yes");
} else {
puts("No");
}
return 0;
}