Trouble
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3459 Accepted Submission(s): 1091
Problem Description
Hassan is in trouble. His mathematics teacher has given him a very difficult problem called 5-sum. Please help him.
The 5-sum problem is defined as follows: Given 5 sets S_1,...,S_5 of n integer numbers each, is there a_1 in S_1,...,a_5 in S_5 such that a_1+...+a_5=0?
The 5-sum problem is defined as follows: Given 5 sets S_1,...,S_5 of n integer numbers each, is there a_1 in S_1,...,a_5 in S_5 such that a_1+...+a_5=0?
Input
First line of input contains a single integer N (1≤N≤50). N test-cases follow. First line of each test-case contains a single integer n (1<=n<=200). 5 lines follow each containing n integer numbers in range [-10^15, 1 0^15]. I-th line denotes set S_i for 1<=i<=5.
Output
For each test-case output "Yes" (without quotes) if there are a_1 in S_1,...,a_5 in S_5 such that a_1+...+a_5=0, otherwise output "No".
Sample Input
2 2 1 -1 1 -1 1 -1 1 -1 1 -1 3 1 2 3 -1 -2 -3 4 5 6 -1 3 2 -4 -10 -1
Sample Output
No Yes多重循环,也能过,注意优化数组的访问方式#include<iostream> #include<cstring> #include<algorithm> using namespace std; typedef __int64 ll; ll da1[201],da2[201],da3[201]; ll two[201*201]; ll four[201*201]; int main() { int i,j,k1,t,n,k2; bool flag=false; cin>>t; while(t--) { scanf("%d",&n); for(j=0;j<n;j++) { scanf("%I64d",da1+j); } for(j=0;j<n;j++) { scanf("%I64d",da2+j); } k1=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { two[k1++]=da1[i]+da2[j]; } } sort(two,two+k1); for(j=0;j<n;j++) { scanf("%I64d",da1+j); } for(j=0;j<n;j++) { scanf("%I64d",da2+j); } k2=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { four[k2++]=da1[i]+da2[j]; } } sort(four,four+k2); for(j=0;j<n;j++) { scanf("%I64d",da1+j); } sort(da1,da1+n); flag=false; for(i=0;i<n;i++) { int left=0; int right=k2-1; while(left<k1&&right>=0) { if(-da1[i]==four[right]+two[left]) { flag=true; break; } if(four[right]+two[left]<-da1[i]) left++; else right--; } if(flag) break; } if(flag) puts("Yes"); else puts("No"); } return 0; }