HDU_2141_CanYouFindIt
来源:互联网 发布:expect linux 编辑:程序博客网 时间:2024/05/06 22:09
题目算法为2分。
穷举显然超时。变换为a+b=x-c
这里需要注意的是题目中a+b在同一组中要多次使用,因此用一个另外的数组生成这个。
在a+b的数组中二分查找x-c即可。因为a+b是比x-c更大的数组。
输出大写小写搞错了,结果查了半天的代码。以后注意。
#include <iostream>#include<stdio.h>#include<algorithm>using namespace std;const int M=505;int s1[M],s2[M],s3[M];int ss[M*M];int bs(int l,int key){ int lo=0,hi=l-1; int mid; while(lo<=hi) { mid=(lo+hi)>>1; if(ss[mid]==key) return 1; else if(ss[mid]>key) hi=mid-1; else lo=mid+1; } return 0;}int fx(int l1,int p,int k){ for(int i=0;i<l1;i++) { if(bs(p,k-s1[i])) return 1; } return 0;}int main(){ //freopen("A.txt","r",stdin);学习使用这种方法输入数据 int l1,l2,l3; int n; int x; int nn=1; //总的组数 while(scanf("%d%d%d",&l1,&l2,&l3)!=EOF) { for(int i=0;i<l1;i++) scanf("%d",&s1[i]); for(int i=0;i<l2;i++) scanf("%d",&s2[i]); for(int i=0;i<l3;i++) scanf("%d",&s3[i]); scanf("%d",&n); printf("Case %d:\n",nn); nn++; int p=0; for(int i=0;i<l2;i++) for(int j=0;j<l3;j++) ss[p++]=s2[i]+s3[j];//二分只是这个题目的一部分 这里是关键 sort(ss,ss+p); //对大的数组进行排序二分 while(n--) { scanf("%d",&x); if(fx(l1,p,x)) printf("YES\n");//注意输出的大小写 else printf("NO\n"); } } return 0;}
0 0
- HDU_2141_CanYouFindIt
- leetcode[119]:Pascal's Triangle II
- 配置SAP打印机
- Apache Cordova
- GRE写作必备句型
- 微信支付
- HDU_2141_CanYouFindIt
- LeetCode—Implement strStr()
- jquery中filter的使用
- 本地搭建SVN局域网服务器
- 适用android的MVP:如何组织展示层
- 知识储备:Android系统架构
- XHTML事件属性
- Windows 7平台安装Oracle Client 10g版本时需要做的一点变更
- Android运行时异常“Binary XML file line # : Error inflating class”