基本上,它围绕从一组数字中找出不同元素对的数量,这些数字的总和不超过某个值。
我的解决方案适用于除最后一个测试用例之外的所有测试用例(在某个私有服务器上,测试用例本身不可用),超过3秒的时间限制半秒。
我是否遗漏了某些算法?一些指示会很好。
这是我的代码:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> hardness;
hardness.reserve(n);
int temp;
for(int i = 1; i <= n; ++i) {
cin >> temp;
if (temp < k) {
hardness.push_back(temp);
}
}
sort(hardness.begin(), hardness.end());
int mx = hardness.back(); //Max element
int chewableCombinations = 0, cur = 0;
for(int i = 0; i < hardness.size() - 1; ++i) {
cur = hardness[i];
if(cur == 0 || cur + mx < k) {
chewableCombinations += hardness.size() - i - 1;
continue;
}
for(int j = i + 1; j < hardness.size(); ++j) {
if(cur + hardness[j] < k) {
++chewableCombinations;
} else break; //we've crossed the limit
}
}
cout << chewableCombinations << endl;
}
答案 0 :(得分:1)
如果硬度[i] +硬度[j] < k然后硬度[i] +硬度[m] < k为所有m&lt;学家
你不必全部检查它们。