C语言--Can you find it?

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题不能太过心急,要多想一想,想出简单可行的办法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值