我刚刚将解决方案发送到用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的在线评委说:“超出时间限制”。有人可以解释原因吗?
答案 0 :(得分:-1)
你可以尝试摆脱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。
祝你好运!