二分查找 HDOJ 2141 Can you find it?
2015-07-25 18:12
495 查看
题目传送门
/* 题意:给出一个数,问是否有ai + bj + ck == x 二分查找:首先计算sum[l] = a[i] + b[j],对于q,枚举ck,查找是否有sum + ck == x */ #include <cstdio> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int MAXN = 5e2 + 10; const int INF = 0x3f3f3f3f; ll a[MAXN], b[MAXN], c[MAXN]; ll sum[MAXN*MAXN]; int tot; bool my_binary_search(int l, int r, ll k) { while (l < r) { int mid = (l + r) >> 1; if (sum[mid] == k) return true; else if (sum[mid] > k) r = mid; else l = mid + 1; } return false; } int main(void) { //HDOJ 2141 Can you find it? //freopen ("HDOJ_2141.in", "r", stdin); int l, n, m, s, cas = 0; while (scanf ("%d%d%d", &l, &n, &m) == 3) { for (int i=1; i<=l; ++i) scanf ("%I64d", &a[i]); for (int i=1; i<=n; ++i) scanf ("%I64d", &b[i]); for (int i=1; i<=m; ++i) scanf ("%I64d", &c[i]); scanf ("%d", &s); printf ("Case %d:\n", ++cas); sort (a+1, a+1+l); sort (b+1, b+1+n); sort (c+1, c+1+m); tot = 0; for (int i=1; i<=l; ++i) { for (int j=1; j<=n; ++j) { sum[++tot] = a[i] + b[j]; } } sort (sum+1, sum+1+tot); ll mn = a[1] + b[1] + c[1], mx = a[l] + b + c[m]; while (s--) { ll q; scanf ("%I64d", &q); if (q < mn || q > mx) { puts ("NO"); continue; } bool flag = false; for (int i=1; i<=m; ++i) { int p = lower_bound (sum+1, sum+1+tot, q - c[i]) - sum; if (p < 1 || p > tot) continue; if (sum[p] + c[i] == q) { flag = true; puts ("YES"); break; } //if (my_binary_search (1, tot, q - c[i])) { //flag = true; puts ("YES"); break; //} } if (!flag) { puts ("NO"); } } } return 0; }
相关文章推荐
- c++ primer 学习笔记-第一章
- POM.xml详解
- 【听课笔记】算法导论1
- (剑指Offer)面试题34:丑数
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- [笔记]Java注解全面解析
- 零钱兑换问题
- 关于树的一些总结
- Android 01:AutoCompleteTextView-简单实现实现自动输入文本效果
- SHU_OJ 1929:Yaoge的英语成绩题解
- CocoaPods 安装及基本使用方法
- grep用法小结
- Vs2012 构建配置 Lua5.2.3
- 深入分析ConcurrentHashMap(转)
- java bean对象之间复制属性
- 数据库中的左连接(left join)和右连接(right join)区别
- 阿里电话面试题详解
- JSLink文件中使用field的自定义属性
- poj3169 差分约束系统
- 输出一个等边三角形的字母阵,等边三角形的两腰为字母A,往里靠依次字母大一个(详细题目文章中描述)