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

C++ 竞争性编程:解决方案运行有点太慢,c++,time,time-complexity,C++,Time,Time Complexity,来自ZCO(分区计算奥林匹克竞赛;印度IOI资格赛)论文 基本上,它围绕着从一组总和不超过某个值的数字中找到不同元素对的数量展开 我的解决方案适用于除最后一个测试用例(在某个专用服务器上,测试用例本身不可用)之外的所有测试用例,该测试用例超过3秒时间限制半秒 从算法上说,我是不是遗漏了什么?给我几点建议就好了 这是我的密码: #include <iostream> #include <vector> #include <queue> #include <

来自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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
int n,k;
cin>>n>>k;
矢量硬度;
硬度.储备量(n);
内部温度;
对于(int i=1;i>temp;
如果(温度cout如果硬度[i]+硬度[j]

你不必全部检查。

正如@Beta所说,你已经按照硬度对它们进行了排序,因此在找到极限之前没有理由逐一进行。有更高效的排序数据搜索算法。一旦排序,甚至可以在线性时间内找到对数。