#include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std ; #define M 500 + 10 int a[M] ; int b[M] ; int c[M] ; int d[M] ; int l ; int n ; int m ; map <int , bool > Map ; void Marge() { for(int i = 0 ;i < l ; ++ i) for(int j = 0 ;j < n ; ++ j) Map[a[i] + b[j]] = 1 ; } bool Check(int x) { int tem ; for(int i = 0 ;i <l ; ++ i) { tem = x - c[i] ; if(Map.count(tem)) return true ; } return false ; } int main() { int s ; int x ; int T = 1 ; while(scanf("%d%d%d",&l ,&n , &m) != EOF ) { for(int i = 0 ;i < l ; ++ i) scanf("%d",a + i) ; for(int i = 0 ;i < n ; ++ i) scanf("%d",b + i) ; for(int i = 0 ;i < m ; ++ i) scanf("%d",c + i) ; scanf("%d",&s) ; printf("Case %d:\n",T ++) ; Marge() ; while(s --) { scanf("%d",&x) ; if(Check(x)) puts("YES") ; else puts("NO") ; } Map.clear() ; } return 0 ; }
标准二分搜索代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std ; const int MAX_N=500; int a[MAX_N]; int b[MAX_N]; int c[MAX_N]; int d[MAX_N*MAX_N]; int l, n, m, s; int main() { int t=0; while(scanf("%d %d %d",&l, &n, &m)!=EOF) { for(int i=0; i<l; i++) { scanf("%d",&a[i]); } for(int i=0; i<n; i++) { scanf("%d",&b[i]); } for(int i=0; i<m; i++) { scanf("%d",&c[i]); } for(int i=0; i<l; i++) { for(int j=0; j<n; j++) { d[i*n+j]=a[i]+b[j]; } } sort(d,d+l*n); scanf("%d",&s); printf("Case %d:\n",++t); while(s--) { int x; scanf("%d",&x); bool flag=false; for(int i=0; i<m; i++) { if(binary_search(d,d+l*n,x-c[i])) { flag=true; break; } } if(flag) { puts("YES"); } else { puts("NO"); } } } return 0 ; }
时间: 2024-10-01 07:47:36