hdu 2141 枚举后 二分查找
2016-05-19 18:08
197 查看
点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=2141
#include <stdio.h> #include <algorithm> using namespace std; const int M=1010; __int64 S[M*M],A[M],B[M],C[M],x,flag,k,t; int BS(__int64 key) { __int64 l=1,r=k,mid; while(l<=r) // { mid=(l+r)/2; if(S[mid]<key) { l=mid+1; } else if(S[mid]>key) { r=mid-1; } else return 1; } return 0; } int main() // 判断是否存在 Ai+Bj+Ck=x Ai Bj Ck 转化为 Ai+Bj=x-ck { // 枚举 A,B的和 sum int l,n,m,s,i,j,c=0; // 在sum中二分查找 x-ck的值是否存在即可 while(scanf("%d%d%d",&l,&n,&m)!=EOF) { for(i=1;i<=l;i++) scanf("%I64d",&A[i]); for(i=1;i<=n;i++) scanf("%I64d",&B[i]); for(i=1;i<=m;i++) scanf("%I64d",&C[i]); k=0; for(i=1;i<=l;i++) // 枚举 A B之和 { for(j=1;j<=n;j++) { S[++k]=A[i]+B[j]; } } sort(S+1,S+k); k=unique(S+1,S+k)-(S+1); // unique ()去掉重复元素后返回最后一个元素的地址 k++; // 个数为地址差 加1 sort(C+1,C+m); scanf("%I64d",&t); printf("Case %d:\n",++c); while(t--) { flag=0; scanf("%I64d",&x); if(x>S[k]+C[m]||x<S[1]+C[1])// { printf("NO\n"); continue; } for(i=1;i<=m;i++) { if(BS(x-C[i])) //在sum中二分查找 x-ck的值是否存在即可 { flag=1; break; } } if(flag) { printf("YES\n"); } else printf("NO\n"); } } return 0; }
相关文章推荐
- java Socket实现简单在线聊天(一)
- 今天开通博客
- 理解JPA注解@GeneratedValue
- 文章标题
- redis 之简单介绍
- Android Drawable Resources系列6:<transition>
- hadoop搭建部署
- 使用HTML5本地储存localStorage
- tsung
- JAVA敏捷开发环境搭建
- 移植samba到安卓
- apache + tomcat 域名问题
- 双线路由策略
- JAVA敏捷开发环境搭建
- JAVA敏捷开发环境搭建
- Android MVP设计模式的理解
- 数据库中Schema(模式)概念的理解
- HZAU 1001 Handing Out Candies
- AngularJS中获取ng-repeat动态生成的ng-model值
- C/C++,java 数据结构---线性链表存储数据:获取数据慢,增删快