Description
Input
Output
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
题目大意:给四组数,从第一二三组中分别找出一个,问是否能组成第四组中的每一个数。
解题思路:
从前两组中选出所有组合的可能,并存放在sum数组里,并对其排序,遍历第三组,在第三组中选个元素,在sum数组中二分查找是否存在与所选元素之和是第四组元素。
注意:
STL 还是少用为好,占用空间大,运行效率差,若用set代替sum,的确是不用排序,但是会 MLE ,在别的题中也会出现用STL的运行时间是手写STL的两倍。。。
如果确保肯定能过,那就用,使代码简洁。
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<set> #include<cstring> #include<algorithm> using namespace std; int A[500]; int B[500]; int sum[250000]; int num, l, m, n; int time = 0; bool ans() { for (int i = 0; i < n; ++i) { int l = 0, r = time-1; while (l < r) { int mid = (l + r) >> 1; if (sum[mid] < num - A[i]) { l = mid + 1; } else { if (sum[mid] > num - A[i]) r = mid - 1; else return true; } } if (sum[l] == num - A[i]) return true; } return false; } int main() { int coun = 0; while (scanf("%d%d%d", &l, &m, &n) != EOF) { time = 0; cout << "Case " << ++coun << ":" << endl; int i, j; for (i = 0; i < l; ++i) scanf("%d", &A[i]); for (i = 0; i < m; ++i) scanf("%d", &B[i]); for (i = 0; i < l; ++i) for (j = 0; j < m; ++j) { sum[time++] = A[i] + B[j]; } sort(sum, sum + time); for (i = 0; i < n; ++i) scanf("%d", &A[i]); int s; scanf("%d", &s); for (i = 0; i<s; ++i) { scanf("%d", &num); if (ans()) { cout << "YES" << endl; } else { cout << "NO" << endl; } } } }