Problem Description
Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
Input
There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth
line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
Output
For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
Sample Input
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Sample Output
Case 1: NO YES NO题意:给你L个A,N个B,M个C以及S个X,问对于每一个x,能否从A,B,C中各找出一个值,使得A+B+C=X.思路:这是一道二分题,可以把A+B+C=X看做A+B=X-C,那么我们先把A+B并成一个集合Z,然后枚举X-C的值,二分寻找Z中是否有这个值。本来挺简单的二分,自己做的时候一直考虑二分C数组,时间复杂度怎么算都超了= .= 。#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; typedef long long ll; typedef long double ldb; #define inf 99999999 #define pi acos(-1.0) #define eps 1e-15 #define maxn 506 ll a[maxn],b[maxn],c[maxn],d[2*maxn],e[maxn]; ll bing[maxn*maxn]; int main() { int n,m,i,j,cas=0,t,p; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { for(i=1;i<=n;i++){ scanf("%lld",&a[i]); } for(i=1;i<=m;i++){ scanf("%lld",&b[i]); } int tot=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ tot++; bing[tot]=a[i]+b[j]; } } sort(bing+1,bing+1+tot); for(i=1;i<=t;i++){ scanf("%lld",&c[i]); } scanf("%d",&p); for(i=1;i<=p;i++){ scanf("%lld",&e[i]); } cas++; printf("Case %d:\n",cas); for(i=1;i<=p;i++){ int flag=0; for(j=1;j<=t;j++){ int wei=lower_bound(bing+1,bing+1+tot,e[i]-c[j])-bing; if(bing[wei]==e[i]-c[j]){ flag=1;break; } } if(flag)printf("YES\n"); else printf("NO\n"); } } return 0; }