hdoj 2141 Can you find it?【二分查找+暴力】
Can you find it?
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 17036 Accepted Submission(s):
4337
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
题意:给你三组数,每组数的个数分别为L N M再给你S个数x判断能否从这三组数中分别找到一个数使Ai+Bj+Ck = X.
题解:暴力肯定超时,所以要用二分,先将三组数中任意两组存入数组str[]中,然后再对每个x进行遍历
1、测试数据太弱,而且这样的一组测试数据本来就是个坑,好多不正确的情况都能得出正确答案
2、输出格式好坑,本来我以为是连续输出NO YES NO一直错没想到竟然是输一个数出一个结果
3、一定要注意给str[]数组排序(二分查找的条件是有序数列)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAX 1100 bool cmp( int a, int b) { return a<b; } int a[MAX]; int b[MAX]; int c[MAX]; int d,str[300000]; int main() { int n,m,j,i; int k=1,l; while (scanf( "%d%d%d" ,&l,&n,&m)!=EOF) { for (i=0;i<l;i++) scanf( "%d" ,&a[i]); for (i=0;i<n;i++) scanf( "%d" ,&b[i]); for (i=0;i<m;i++) scanf( "%d" ,&c[i]); int len=0; for (i=0;i<n;i++) { for (j=0;j<m;j++) { str[len++]=b[i]+c[j]; } } sort(str,str+len,cmp); int ok; printf( "Case %d:\n" ,k++); int s; scanf( "%d" ,&s); for (i=0;i<s;i++) { scanf( "%d" ,&d); ok=0; for (j=0;j<l;j++) { int left = 0,right = len,mid = 0; int goal = d - a[j]; while (right >= left) { mid = (right + left) >> 1; if (str[mid] < goal) left = mid + 1; else if (str[mid] > goal) right = mid - 1; else { ok=1; break ; } } if (ok) break ; } if (ok) printf( "YES\n" ); else printf( "NO\n" ); } } return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步