HDOJ 2141 Can you find it?
2016-01-21 12:42
274 查看
Can you find it?
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)Total Submission(s): 20106 Accepted Submission(s): 5099
Problem Description
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.
Input
There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth
line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
Output
For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
Sample Input
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Sample Output
Case 1: NO YES NO
用三个for循环会超时
后来就改进了一下把函数改为:A+B=X-C,然后二分搜一下就可以了;
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 500 + 10; long long ab[maxn * maxn], a[maxn], b[maxn], c[maxn]; long long len; int binary_search(long long kk) { long long fir = 0, las = len - 1; while (fir <= las){ long long middle = (fir + las) / 2; if (ab[middle] == kk) return 1; else if (ab[middle] > kk) las = middle - 1; else fir = middle + 1; } return 0; } int main() { long long l, n, m, s, x; long long ans, flag; ans = 0; while (scanf("%I64d%I64d%I64d", &l, &n, &m) != EOF){ len = 0; for (int i = 0; i < l; i++) scanf("%I64d", &a[i]); for (int i = 0; i < n; i++) scanf("%I64d", &b[i]); for (int i = 0; i < m; i++) scanf("%I64d", &c[i]); for (int i = 0; i < l; i++){ for (int j = 0; j < n; j++){ ab[len++] = a[i] + b[j]; } } sort (ab, ab + len); sort (c, c + m); scanf("%I64d", &s); printf("Case %I64d:\n", ++ans); while (s--){ scanf("%I64d", &x); if (x < ab[0] + c[0] || x > ab[len - 1] + c[m - 1]){ printf("NO\n"); continue; } flag = 0; for (int i = 0; i < m; i++){ long long kk = x - c[i]; if (binary_search(kk)){ flag = 1; break; } } if (flag) printf("YES\n"); else printf("NO\n"); } } return 0; }
相关文章推荐
- 冒泡排序
- 升级python之后,yum下载东西时出现File "/usr/bin/yum", line 30
- 唯品会峰值系统架构演变
- TencentApiInterfaceDelegate 是这个找不到的原因
- C# word 操作页脚书签
- 依据前序和中序列 重建二叉树
- linux-0.12/boot/setup.S`
- 珠排序Bead Sort
- 安卓加载外部数据库
- Special data type: bit, sql_variant
- Linux--- MySQL中GRANT命令执行时发生root权限报错及解决方法
- What is Docker and why is it so darn popular?
- librtmp发送AVC,AAC数据包
- 225,常见的编程注意点
- HDOJ 2578 Dating with girls(1)
- 常用软件整理
- MFC消息解析说明
- iOS开发常用技巧
- 学习技术的几个境界
- hive表信息查询:查看表结构、表操作等