H - 4个数和为0
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
Input第1行,1个数N,N为数组的长度(4 <= N <= 1000)
第2 - N + 1行:Ai(-10^9 <= Ai <= 10^9) Output如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。 Sample Input
第2 - N + 1行:Ai(-10^9 <= Ai <= 10^9) Output如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。 Sample Input
5 -1 1 -5 2 4Sample Output
Yes
暴力枚举就可以了,注意一点就是不可以一起加起来与0比较,不然会long long会爆的。
只需要前者两个数的和,与后者的两个数的和是不是成相反数,就可以了。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long a[1100]; long long sum; int n; int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%lld",&a[i]); sort(a,a+n); int flag = 0; for(int i=0;i<n;i++) { if(a[i]>0) break; for(int j=i+1;j<n;j++) { sum = a[j]+a[i]; int k=j+1; int t=n-1; while(t>k) { if(a[k]+a[t]==-sum) { flag=1; break; }else { if(a[k]+a[t]>-sum) { t--; }else{ k++; } } } } if(flag) break; } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
温馨提示: 这样的时间少一点,最里面的时间复杂度是O(N-X)次,如果两层的循环的话,就是O(N*(N-1))大约,会超时间的。