【问题标题】:Competitive programming: Solution runs a bit too slow竞争性编程:解决方案运行速度有点慢
【发布时间】: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


【解决方案1】:

如果硬度[i]+硬度[j]

您不必全部检查。

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 2012-02-22
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多