更快的输入和输出

时间:2014-03-01 08:18:36

标签: c++

#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;
}

伙计我尝试了用于排序的索引方法和codechef显示了这个问题的复杂性不是o(n)但更接近它...问题的时间限制为5秒,源限制为50000字节。

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

2 个答案:

答案 0 :(得分:4)

我非常确定您的代码存在问题,因为您在循环中使用cout << x << endl;会打印大量的行。

我会在几分钟后回到“差异”。

编辑:不确定无论如何我都能做出很多改变。显然,取决于编译器,它可能会有很大差异,但是使用我的g ++ -O2和100000输入数字,使用endl;需要0.16 - 0.18s,使用'\n'需要0.06 - 0.07s

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

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

所有测量均以文件作为输入,文件作为输出 - 写入shell需要更长的时间,但那是因为它滚动了100k行文本。

(你的程序会因为“大”输入或大量输入而崩溃 - 如果max大于约1百万,代码将因堆栈外崩溃而崩溃 - 在许多系统上,也会发生较低的值)

答案 1 :(得分:0)

避免使用 cin cout ,并使用C IO功能 scanf printf 。你会发现它们比慢速c ++函数快5倍。