Trouble
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3526 Accepted Submission(s): 1113
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
题意:
给定五个集合,从五个集合中分别取出5个数,如果存在满足a1 +a2 + a3 + a4 +a5 = 0
分析:
事实上考虑如下问题,快速求解序列A,序列B中,是否有Ai+Bj=x ,记得是某知名公司的一道面试题吧;
是两个指针的应用,将A,B升序排列,初试 i 指针指向A[1] ,j 指针指向 B[b_size] ,比较Ai + Bj 与 x 的
大小。若A[i]+B[j]<x , i 指针右移 ; 若 A[i]+B[j]>x , j 指针左移 。事实上是一个贪心的思想。
个人感悟:
使用returen 比 break 好吧。
#include <iostream> #include <string.h> #include <string> #include <algorithm> #include <stdio.h> #include <queue> #include <set> #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std ; typedef long long LL ; struct Me{ LL N ,N_2 ,a_size ,b_size ,c_size; LL num[5][208] ; LL A[208*208] ; LL B[208*208] ; LL C[208] ; Me(){} Me(int n):N(n){} void read_init(){ for(int i=0;i<=4;i++) for(int j=1;j<=N;j++) scanf("%I64d",&num[i][j]) ; int k ; k=0; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) A[++k]=num[0][i]+num[1][j]; k=0 ; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) B[++k]=num[2][i]+num[3][j]; for(int i=1;i<=N;i++) C[i]=num[4][i] ; } int my_search(LL x){ int i=1 ; int j=b_size ; while(i<=a_size&&j>=1){ if(A[i]+B[j]<x) i++ ; else if(A[i]+B[j]==x) return 1 ; else if(A[i]+B[j]>x) j-- ; } return 0 ; } int calc(){ sort(A+1,A+1+N*N) ; a_size=unique(A+1,A+1+N*N)-(A+1) ; sort(B+1,B+1+N*N) ; b_size=unique(B+1,B+1+N*N)-(B+1) ; sort(C+1,C+1+N) ; c_size=unique(C+1,C+1+N)-(C+1) ; for(int i=1;i<=c_size;i++){ if(my_search(-1*C[i])) return 1 ; } return 0 ; } void gao_qi(){ read_init() ; if(calc()) puts("Yes") ; else puts("No") ; } }; int main(){ int T ,N ; cin>>T ; while(T--){ scanf("%d",&N) ; Me me(N) ; me.gao_qi() ; } return 0 ; }