竞争性编程:解决方案运行有点太慢

时间:2014-12-04 13:11:21

标签: c++ time time-complexity

来自ZCO(Zonal Computing Olympiad;印度IOI资格赛)论文的

This is a question

基本上,它围绕从一组数字中找出不同元素对的数量,这些数字的总和不超过某个值。

我的解决方案适用于除最后一个测试用例之外的所有测试用例(在某个私有服务器上,测试用例本身不可用),超过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;
}

1 个答案:

答案 0 :(得分:1)

如果硬度[i] +硬度[j] < k然后硬度[i] +硬度[m] < k为所有m&lt;学家

你不必全部检查它们。