A
来源:互联网 发布:游戏买号用什么软件 编辑:程序博客网 时间:2024/05/29 10:59
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 31 2 31 2 31 2 331410
Case 1:NOYESNO
刚开始看到这道题时大部分人会想到用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;}
阅读全文
0 0
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- A
- A*
- a
- A
- a
- 事件
- I2C编程接口
- Python的ASCII, UTF-8 相互转换
- Bad Hair Day
- js:输出jira上当天解决的问题信息
- A
- Angular2:Cold vs Hot Observables
- 欢迎使用CSDN-markdown编辑器
- 动画
- 【JavaSE学习笔记】多线程01_Thread,Runnable,synchronize同步机制
- 敏捷开发平台AgileEAS.NET中的本地数据库连接过程(以DrugShop为例)
- Java内存区域总结
- Linux(一):运行级别查询及切换
- wxPython 实现文件拖拽功能