更快的输入和输出

Faster input and output

本文关键字:输出 输入      更新时间:2023-10-16
#include<iostream>
using namespace std;
int main(){
int i,x,max=0;
cin>>x;
int a[x];
for(i=0;i<x;i++){
cin>>a[i];
if(max<a[i]){
max=a[i];}                 
}
int b[max+1];
for(i=0;i<max+1;i++){
b[i]=-1;
}
for(i=0;i<x;i++){
if(b[a[i]]==-1){
b[a[i]]=1;
}
else{
b[a[i]]++;
}
}
i=0;
while(i<=max){
while(b[i]>0&&b[i]!=-1){
cout<<i<<endl;
b[i]--;
}
i++;
}
return 0;
}

伙计们,我尝试了索引方法进行排序,代码厨师展示了它。。这个问题的复杂性不是o(n),而是更接近于它。。。问题的时间限制为5秒,源限制为50000字节。。

关于如何通过更快的i/o或代码计算来提高性能的任何帮助。。。

我很确定您的代码有问题,因为您在循环中使用cout << x << endl;,该循环将打印大量行。

我几分钟后会带着"不同"回来。

编辑:无论哪种方式,我都不确定自己能做出多大的改变。显然,根据编译器的不同,它可能会有很大的变化,但对于我的g++-O2和100000个输入数字,使用endl;需要0.16-0.18秒,使用'n'输出需要0.06-0.07秒。

使用printf不比cout快,但scanfcin快一点(0.04s+/-0.05)

然而,这确实与sync_with_stdio有关。如果我们使用cin.sync_with_stdio(false);,那么scanfcin的结果是相同的。

所有的测量都是以文件作为输入,以文件作为输出进行的——写入外壳需要更长的时间,但这是因为它正在从我身边滚动10万行文本。

(在许多系统上,如果max大于约100万,则程序会因"大"输入或大量输入而崩溃,代码会因堆栈外而崩溃,对于较低的值也可能发生这种情况)

避免cincout,而是使用C IO函数scanfprintf