计算机 1s 的计算能力:1000 000 次, 游刃有余; 10 000 000,勉强; 100 000 000,很悬,一般不能。
1.1 抽签
有 n 张纸片, 每个纸片上一个任意数字 ki 。取出 1 张,记下数字后放回,取 4 次。如果 4 个数字的和是 m, 则赢。给定一个 m, 判断是否有赢的可能性 (输出 Yes or No)。
Limits : (1 <= n <= 1000, 1 <= m <= 108, 1<= ki <= 108)
样例1:输入:n = 3, m = 10, k = {1, 3, 5} 输出: Yes (如:1, 1, 3, 5)
样例2:输入:n = 3, m = 9, k = {1, 3, 5} 输出: No (不存在)
思路: 若递归四次: 10004 >> 109, 肯定超时,故此方法不可取。
优化方法:任意两个的和共 n2 个, 只要从 n2 个数中找到有没有两个数的和为 m 即可。同时,对这 n2 个数排序,利用二分查找求解。
时间复杂度: O(N2logN)
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main () { int n, m; cin >> n >> m; vector<int> k(n); vector<int> sum(n*n); for (int i = 0; i < n; ++i) cin >> k[i]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { sum[i*n+j] = k[i] + k[j]; } } sort(sum.begin(), sum.end()); bool exist = false; for(int i = 0; i < n; ++i) { if (binary_search(sum.begin(), sum.end(), m-sum[i])) { exist = true; break; } } if(exist) cout << "Yes" << endl; else cout << "No" << endl; return 0; }
时间: 2024-11-02 12:56:12