CSU-ACM2017暑假集训2-二分搜索 A

来源:互联网 发布:怎么修改tomcat的端口 编辑:程序博客网 时间:2024/06/03 15:21

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 31 2 31 2 31 2 331410

Sample Output

Case 1:NOYESNO

有三个vector,每个vector的元素可达500个,如果直接枚举,O(n^3)这样的复杂度肯定会超时,于是将前两个vector加起来,得到 vecG ,第三个vector是 vecC
显然,对于 vecCvecG 中的元素 vecC[i]vecG[j] ,以及每个令等式成立的的 X (记为 Xp)满足以下关系:

i[0,vecC.size()), j[0,vecG.size()),   XpvecC[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;}
阅读全文
0 0
原创粉丝点击