A

来源:互联网 发布:rundll32调用js 编辑:程序博客网 时间:2024/05/22 11:29

这题用二分做很水,关键是求两个数组的之和,求和完后排序,然和剩下那个数组枚举,两个数组二分就可以了。

#include<iostream>#include<string.h>#include<string>#include<stack>#include<queue>#include<functional>#include<set>#include<map>#include<stdlib.h>#include<vector>#include<math.h>#include <algorithm>#pragma warning(disable:4996)using namespace std;int a[510];int b[510];int c[510];int d[1010];int sum[1000000];int l,n,m,t=1;int find(int sum[],int q,int k){int lo = 0, r = q - 1,mid;while (lo <= r){mid = ((r - lo) >> 1) + lo;if (sum[mid] == k)return mid;else if(k>sum[mid])lo = mid+1;elser = mid-1;}return 0;}int main(){while (~scanf("%d %d %d", &l, &n, &m)){int s,flag,cnt=0,i,j;memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));for ( i = 0; i < l; i++)scanf("%d", &a[i]);for ( i = 0; i < n; i++)scanf("%d", &b[i]);for ( i = 0; i < m; i++)scanf("%d", &c[i]);for ( i = 0; i < l; i++)for ( j = 0; j < n; j++)sum[cnt++] = a[i] + b[j];sort(sum, sum +cnt);scanf("%d", &s);printf("Case %d:\n", t++);while(s--){int x;scanf("%d", &x);flag = 0;for ( i = 0; i < m; i++){int f = x - c[i];if (find(sum, cnt, f)){printf("YES\n");break;}}if (i>=m)printf("NO\n");}}return 0;}


原创粉丝点击