3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Sample Output
Case 1: NO YES NO题目大意:
给出三段数列,求是否能从每一个数列中找到一个数使得a+b+c=x成立。
思路:
这道题明显是从一堆数中找某个数,自然就想到二分啦,最朴素的做法就是三个二分嵌套,不过有可能超时,反正我没试过,可以尝试下这个思路,就是把两个数列的和的全部情况算出来,存到一个数组中然后对这个数组进行二分,所以就是一个for加一个二分就可以了。
下面是ac代码:
#include<cstdio>
#include<string.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int a[505],b[505],c[505],l,m,n,s,d[505*505],x;
int main()
{
int k=1;
while(~scanf("%d%d%d",&l,&m,&n))
{
for(int i=0;i<l;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
for(int i=0;i<n;i++)
scanf("%d",&c[i]);
int t=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
d[t++]=b[i]+c[j];
}
scanf("%d",&s);
printf("Case %d:\n",k++);
sort(d,d+t);
while(s--){
scanf("%d",&x);
int falt=0;
for(int i=0;i<l;i++)
{
int low=0,high=t,mid;
while(low<=high)
{
mid=(high+low)/2;
if(d[mid]+a[i]==x)
{
falt=1;
break;
}
else if(d[mid]+a[i]<x)
low=mid+1;
else
high=mid-1;
}
if(falt)
break;
}
if(falt)
printf("YES\n");
else
printf("NO\n");
}
} return 0;
}