【发布时间】:2015-02-02 09:16:16
【问题描述】:
This is a question 来自 ZCO(区域计算奥林匹克;印度 IOI 资格赛)论文。
基本上,它围绕从总和不超过某个值的一组数字中找到不同元素对的数量。
我的解决方案适用于除了最后一个测试用例(在某个私有服务器上,测试用例本身不可用)之外的所有测试用例,它超过了 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;
}
【问题讨论】:
-
正如@Beta 所说,您已经将它们按硬度排序,因此在找到极限之前没有理由一一前进。有更高效的排序数据搜索算法。
-
排序后,甚至可以在线性时间内找到对数。
标签: c++ time time-complexity