CSU-ACM2017暑假集训2-二分搜索 A - Can you find it?
2017-07-25 23:14
615 查看
A - Can you find it?
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
有三个vector,每个vector的元素可达500个,如果直接枚举,O(n^3)这样的复杂度肯定会超时,于是将前两个vector加起来,得到 vecG ,第三个vector是 vecC 。
显然,对于 vecC 、vecG 中的元素 vecC[i] 和 vecG[j] ,以及每个令等式成立的的 X (记为 Xp)满足以下关系:
∀i∈[0,vecC.size()), ∃j∈[0,vecG.size()), Xp−vecC[i]=vecG[j]
由公式可知,对所有给出的 X ,只要使用binary_search()判断 vecG 中是否存在 X - vecC[j] 这个值,就可以知道这个 X 是不是可以由三个容器中的值组合得到。这样一来,复杂度将为O(n^2),来自求vecG的步骤。
#include <iostream> #include <vector> #include <algorithm> #include <cstdio> using namespace std; int main(){ int l, n, m, t = 1; while(cin >> l >> n >> m){ int temp; vector<int> vecA, vecB, vecC, vecS, vecG; for(int i = 0; i < l; i++){ scanf("%d", &temp); vecA.push_back(temp); } for(int i = 0; i < n; i++){ scanf("%d", &temp); for(int j = 0; j < l; j++){ vecB.push_back(temp + vecA[j]); } } sort(vecB.begin(), vecB.end()); for(int i = 0; i < vecB.size(); i++){ if(!binary_search(vecG.begin(), vecG.end(), vecB[i])) vecG.push_back(vecB[i]); } for(int i = 0; i < m; i++){ scanf("%d", &temp); vecC.push_back(temp); } int s; cin >> s; cout << "Case " << t++ << ":" << endl; for(int i = 0 ;i < s; i++){ scanf("%d", &temp); int j; for(j = 0; j < vecC.size(); j++){ if(binary_search(vecG.begin(), vecG.end(), temp - vecC[j])){ cout << "YES" << endl; break; } } if(j == vecC.size()) cout << "NO" << endl; } } return 0; }
相关文章推荐
- Can you find it? --CSU-ACM2017暑假集训2-二分搜索
- CSU-ACM2017暑假集训2-二分搜索 hdu2141- Can you find it?
- 4 Values whose Sum is 0 --CSU-ACM2017暑假集训2-二分搜索
- CSU-ACM2017暑假集训2-二分搜索 poj-2456 Aggressive cows-最大化最小值
- Monthly Expense--CSU-ACM2017暑假集训2-二分搜索
- CSU-ACM2017暑假集训2-二分搜索 C - 4 Values whose Sum is 0
- CSU-ACM2017暑假集训2-二分搜索 hdu2119 - Can you solve this equation?
- csu-acm2017暑假集训2-二分搜索D - Monthly Expense
- CSU-ACM2017暑假集训2-二分搜索 F - Drying
- CSU-ACM2017暑假集训2-二分搜索 poj3104-drying
- CSU-ACM2017暑假集训2-二分搜索 D - Monthly Expense
- CSU-ACM2017暑假集训2-二分搜索 poj-2785-4 Values whose Sum is 0
- Can you solve this equation?--CSU-ACM2017暑假集训2-二分搜索
- CSU-ACM2017暑假集训2-二分搜索 poj-3258- River Hopscotch
- CSU-ACM2017暑假集训2-二分搜索 poj-32732 Monthly Expense
- HDU2141 Can you find it?(搜索,二分)
- HDOJ 题目2141 Can you find it?(二分搜索)
- 简单搜索练习(一)二分入门 HDU 2141 Can you find it?POJ 2785 4 Value whose Sum is 0
- CSU-ACM2016暑假集训训练1-二分搜索-C
- HDOJ 2141 Can you find it?(二分搜索的优化+总结)