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
题目大意:第一行输入三个数定义三个数组a[i],b[j],c[k],三个数代表数组大小;然后分行输入数组,下面是一个数N,有N行待测数据X,如果 a[i]+b[j]+c[k]=x,输出YES,否者输出NO。
题目分析:传统方法暴力枚举坑定不是良解太过繁琐,那么用什么那?得到一个合并数组s[],然后判断c[k]==x-s[]成立与否,然后用二分查找OK
重点及难点分析:1,如何转变为二分查找的应用
2,然后处理二分查找中的各种情况
AC代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[501],b[501],c[501];
int maxX[250003]; //定义符合数组注意它的大小
int main()
{
int i,j,k,m,n,s,t,count=1,p,flag;
while(scanf("%d%d%d",&k,&m,&n)!=EOF)
{
p=0;
for(i=0;i<k;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++)
scanf("%d",&c[i]);
for(i=0;i<k;i++)
{
for(j=0;j<m;j++)
maxX[p++]=a[i]+b[j];
}
sort(maxX,maxX+p);
printf("Case %d:\n",count++);
scanf("%d",&t);
while(t--)
{
flag=0;//定义flag标记,作为输出式子的判断
scanf("%d",&s);
for(i=0;i<n;i++)
{
int l=0,r=p-1,mid;
while(l<=r)
{
mid=(l+r)/2;
if(maxX[mid]+c[i]==s)
{
flag=1;
break;
}
else if(maxX[mid]+c[i]<s)
l=mid+1;
else if(maxX[mid]+c[i]>s)
r=mid-1;//核心部分二分查找条件判段</span>
}
if(flag)
break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
心得:ac明白A题不能太过心急,要多想一想,想出简单可行的办法