Hdu 2141 解题报告
2016-12-15 22:00
351 查看
原题:http://acm.hdu.edu.cn/showproblem.php?pid=2141
题目大意:输入A,B,C三个整型数组(数组长度1<=len<=500),然后访问S(1<=S<=1000)次,判断A,B,C三个数组中是否存在这样三个数使得A[i]+B[j]+C[k] = X;是就输出YES,否则输出NO;
代码:
题目大意:输入A,B,C三个整型数组(数组长度1<=len<=500),然后访问S(1<=S<=1000)次,判断A,B,C三个数组中是否存在这样三个数使得A[i]+B[j]+C[k] = X;是就输出YES,否则输出NO;
分析:如果直接将三个数组合并最坏的情况是500^3的数组长度,而且三个整型数相加,减很有可能就超过了int的范围了。所以还要另想办法,如果把等式变形A[i]+B[j] = X –C[k];(两个int 数相加减也有可能超过范围,这就要看测试数据了),这样变形后,就可以把A,B数组合并成ab[500*500],然后在ab[]中找X-C[k],这里可以选择用二分查找,查找过程还可以进行一些优化……
代码:
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int num_a[510],num_b[510],num_c[510],a,b,c,len; int ab[250000]; void addab(int num_a[],int num_b[]) { len = 1; memset(temp,0,sizeof(temp)); for (int i = 0 ; i < a; i++) // 合并num_a,num_b for (int j = 0; j < b; j++) ab[len++] = num_a[i] + num_b[j]; sort(ab+1,ab+len); } bool find(int s) { int low,heigh,mid,flag,n; if (s - num_c[c-1] > ab[len-1] ) return false; //如果要找的s比最大值还大 if (s - num_c[0] < ab[1] ) return false; //或s比最小值还小 for (int k = 0; k < c; k++) { n = s-num_c[k]; flag = 0; if (n >= ab[1] && n <= ab[len-1]) { low = 1,heigh = len-1, flag = 1; while (low <= heigh) //在ab中二分查找n; { mid = (low + heigh)/2; if (ab[mid] < n) low = mid+1; else if (ab[mid] > n) heigh = mid-1; else if (ab[mid] == n) return true; } } } return false; } int main() { int i,case_n,j,k,n,s,Max_a = -1,Max_b = -1; case_n = 0; while (scanf("%d%d%d",&a,&b,&c) != EOF) { case_n++; for (i = 0; i < a; i++) scanf("%d",&num_a[i]); for (j = 0; j < b; j++) scanf("%d",&num_b[j]); for (k = 0; k < c; k++) scanf("%d",&num_c[k]); sort(num_c+0,num_c+c); addab(num_a,num_b); //将num_a,num_b合并存入ab中 scanf("%d",&n); printf("Case %d:\n",case_n); while (n > 0) { scanf("%d",&s); if (find(s)) printf("YES\n"); else printf("NO\n"); n--; } } return 0; }
相关文章推荐
- acm解题报告 HDU 2141 Can you find it?
- Hdu 1084 What Is Your Grade?解题报告
- HDU--2104--hide handkerchief--解题报告(辗转相除的运用)
- hdu 1064 解题报告
- HDU 3732 Ahui Writes Word 解题报告
- HDU 1587 Flowers 解题报告
- hdu 1102 pku 2421 解题报告
- HDU 1856 More is better 解题报告
- HDU 2469 Fire-control System解题报告
- hdu 2139解题报告
- HDU 1217 Arbitrage 解题报告
- HDU第11版解题报告(农夫版)
- hdu 2516解题报告
- HDU 3335 解题报告
- hdu 1019解题报告
- Hdu 1009 FatMouse' Trade解题报告
- HDU 3336 解题报告
- 终曲(hdu 2572)解题报告
- POJ-2141-Message Decowding-解题报告
- HDU 1231 畅通工程 解题报告