【问题标题】:Code for calculating instances where the condition is true计算条件为真的实例的代码
【发布时间】:2016-08-23 14:16:24
【问题描述】:

最近我在为即将到来的 zoc 练习时遇到了this codechef 问题。

问题要求计算总和大于另一个给定数字的给定数字的组合数。

以前我有一个蛮力算法,它给出了正确的答案,但花了很多时间,在某些情况下甚至超过一秒钟,这在 codechef 中引发了 TLE 错误。

所以我改变了我的整个算法来摆脱那个 TLE 错误,但现在它只为第一次测试提供正确的答案,其余的产生错误的输出,有人可以帮我弄清楚我在这里做错了什么:

#include <iostream>
#include <vector>
int main(){
    std::vector<long long> tstCases;
    std::vector<long long> okset;
    std::vector<long long> testset;
    for(int i =0;i<2;i++){
        long long cases;
        std::cin >> cases;
        tstCases.push_back(cases);
    }
    long long n = tstCases.at(0);
    long long k = tstCases.at(1);
    for(long long i =0;i<n;i++){
        long long cases;
        std::cin >> cases;
        if(cases<=k){
            if(cases < k/2){
                okset.push_back(cases);
            }else{
                testset.push_back(cases);
            }
        }
    }
    long long l = okset.size();
    long long p1 = (l*(l-1))/2;
    long long p2 = 0;
    if(l > 0){
        for(long long i =0;i<l;i++){
            for(long long j =0;j<testset.size();j++){
                if(okset.at(i)+testset.at(j) >= k){
                    break;
                }else{
                    p2++;
                }
            }
        }
    }
    long long p = p1+p2;
    std::cout << p << std::endl;
    return 0;

}

注意:我正在使用long long,因为问题指示我这样做,而我懒得自己做,所以我使用全部替换。很抱歉。

【问题讨论】:

  • 为什么要使用中断条件,因为您还没有对testset 向量进行排序,所以可以存在更多满足条件的值。
  • 啊,现在我想起来了,我用纸而不是代码写了那个排序的东西。谢谢
  • hmm 代码仍然未能在给定的时间限制内通过最后一次测试,结果我得到了一个 TLE,我仍然必须改进算法,天哪,我可以说我学到了一点渐近分析。

标签: c++ algorithm performance vector comparison


【解决方案1】:

看来我还没有对测试集数组进行排序,因此在该 break 语句之后留下了许多项目。感谢uSeemSurprised 帮助我注意到这一点。

【讨论】:

    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多