HDU 2141 二分查找,实现上简单,思想很重要
2016-10-12 09:11
363 查看
再次应用二分的思想。
用三个for循环会超时
后来就改进了一下把函数改为:A+B=X-C,然后二分搜一下就可以了;
用三个for循环会超时
后来就改进了一下把函数改为:A+B=X-C,然后二分搜一下就可以了;
#include <iostream> #include <algorithm> using namespace std; const int N = 505; __int64 ab[N * N]; int num; int search(__int64 x) { int f = 0, l = num - 1; int mid; while(f <= l) { mid = (f + l) / 2; if(ab[mid] == x) return 1; else if(ab[mid] < x) f = mid + 1; else l = mid - 1; } return 0; } int main() { int n, m, l, flag = 0, s; __int64 a , b , c , x; while(cin >> n >> m >> l) { flag++; num = 0; for(int i = 0; i < n; i++) scanf("%I64d", &a[i]); for(int i = 0; i < m; i++) scanf("%I64d", &b[i]); for(int i = 0; i < l; i++) scanf("%I64d", &c[i]); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) ab[num++] = a[i] + b[j]; sort(ab, ab+num); sort(c, c+l); scanf("%d", &s); printf("Case %d:\n", flag); while(s--) { scanf("%I64d", &x); if(x < ab[0] + c[0] || x > ab[num-1] + c[l-1]) printf("NO\n"); else { __int64 p; int j; for(j = 0; j < l; j++) { p = x - c[j]; if(search(p)) { printf("YES\n"); break; } } if(j == l) printf("NO\n"); } } } return 0; }
相关文章推荐
- HDU 2141 二分查找,实现上简单,思想很重要
- hdu 2141 Can you find it? 二分查找
- Can you find it?(hdu 2141 二分查找)
- 二分查找的算法思想和实现过程
- Can you find it? (HDU_2141) 二分查找
- HDU-2899(简单数学问题+二分查找)
- hdu 2141(二分查找,合并数组)
- HDU 2141 二分查找
- HDU 2141 Can you find it? 二分查找
- 二分查找的简单实现
- hdu 2141 二分查找
- 二分查找:hdu 2141 Can you find it?
- HDU-2141 Can you find it? 简单二分
- 简单二分查找和递归的思想
- hdu 2141 Can you find it? 二分查找
- 二分查找,二叉查找树(二叉排序树)的基本思想以及算法实现
- 【Cuda并行编程之一】二分查找的探究以及Cuda的简单实现&&相关面试题介绍
- hdu 2141 二分查找
- HDU 3585 maximum shortest distance 最大团+简单的二分思想
- HDU 2141 can you find it?【二分查找】