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.
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
刚开始看到这道题时大部分人会想到用for循环来完成,但是肯定会超时的,所以我们就想到用二分法来完成,这虽然是一道二分的简单题,把二分法学会会用其实是很困难的。该题还要注意到flag的用法。
#include <iostream>
#include <cstdio>
#include<algorithm>
using namespace std;
const int MAX=500+5;
int arr[MAX*MAX];
int k,flag;
void bs(int x)
{
int left,right,mid;
left=0,right=k-1;
while(left<=right)
{
mid=(left+right)>>1; //要比单纯的(left+right)/2快很多
if(arr[mid]>x)
right=mid-1;
else if(arr[mid]<x)
left=mid+1;
else
{
flag=1;
return;
}
}
return;
}
int main()
{
int L,N,M,Case=1;
while(~scanf("%d%d%d",&L,&N,&M))
{
int a[MAX],b[MAX],c[MAX],T,x;
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]);
k=0;
for(int i=0;i<L;i++)
for(int j=0;j<N;j++)
arr[k++]=a[i]+b[j]; //本题的二分主要用在这儿把数组a[i]的和fa数组b[i]又
sort(arr,arr+k);
scanf("%d",&T);
printf("Case %d:\n",Case++);
while(T--)
{
flag=0;
scanf("%d",&x);
for(int i=0;i<M;i++)
{
bs(x-c[i]);
if(flag)
{
printf("YES\n");
break;
}
}
if(!flag)
printf("NO\n");
}
}
return 0;
}