繁体   English   中英

C++在线判断中超出时间限制

[英]Time Limit Exceeded in C++ Online Judge

我刚刚发送了一个用 C++ 编写的 COJ 问题的解决方案。 问题是这个链接: http : //coj.uci.cu/24h/problem.xhtml?pid=1839
这是我的解决方案:

  #include<iostream>

  using namespace std;

  unsigned int t, n;

  int main(){

     cin >> t;

    while(t > 0 && cin >> n){
        cout<< ( n * 8 ) + 42 << endl;
        t--;
    }
    return 0;
  }

对此,COJ 的在线法官说:“超出了时间限制”。 有人可以解释为什么吗?

您可以尝试摆脱std::endl因为它很慢。 相反,您使用“\\n”。 代码如下:

#include<iostream>

  using namespace std;

  unsigned int t, n;

  int main(){



    cin >> t;

    while(t > 0 && cin >> n){
        cout<< ( n * 8 ) + 42 << '\n';
        t--;
    }

    cout.flush();
    return 0;
  }

或者您可以尝试printf()来固定您的 I/O。

这个算法是线性增长的,应该不是限制因素。 我相信I/O是限制因素。 如果您能找到log N的算法,请告诉我。

有人投票否决它,因为他们认为使用标准输出(stdout)进行 I/O 速度很快。 然而, std::endl在每次迭代后刷新,这使得它变慢。

另一个思路是使用递归,希望判断系统对尾递归有很好的优化(有可能)。 它也可能变得更快一点。

在你自己的电脑上,你甚至可以试着分析一下,找出限制因素,如果是I/O,试试上面的方法。

如果它仍然不够快,摆脱面向对象的设计,使用 C 并直接写入 stdout 而不是使用 printf。

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM