NOIP比賽中如何加速c 的輸入輸出

2022-03-29 11:37:34 字數 2860 閱讀 7799

在競賽中,遇到大資料時,往往需要更快的讀取方式。由於比賽中輸出一般規模較小,本文只討論輸入如何加速.

現在我們生成1000000個隨機數,構成1000*1000的矩陣,然後輸入比較時間(win 10系統)

#include

#include

#include

using

namespace

std;

int main()

cout

在比賽中,經常出現資料集超大造成 cin tle的情況。這時候大部分人(包括原來我也是)認為這是cin的效率不及scanf的錯

準確的說,cin在不優化的情況下效率是很低的,我們來測試一下

可以看出,cin的用時達到了驚人的0.763s!!!假如執行時間限制為1s,那麼程式只剩下0.3秒來計算,是極容易tle的

因此,遇到大資料時盡量避免用cin

有部落格提到:

預設的時候,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心檔案指標混亂,同時cout和stdout也一樣,兩者混用不會輸出順序錯亂。正因為這個相容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需乙個語句std::ios::sync_with_stdio(false);,這樣就可以取消cin與stdin的同步了

其實還有乙個等價的寫法

cin.

tie(0);//取消cin的同步

cout.

tie(0);//取消cout的同步

我們來驗證一下:

#include

#include

#include

using

namespace

std;

int a[1005][1005];

int main()

}printf("time used=%.3fs\n",double(clock()-s)/clocks_per_sec);

}

時間變成了0.173s,相比cin是飛躍性的優化

但是別急著高興,本人親測,在noip的評測機上這樣子會爆0

因此,noip比賽中堅決不要寫std::ios::sync_with_stdio(false)

爆0的原因如下

noip明確要求使用freopen,而freopen是stdio庫中的,既然我們已經取消了iostream和stdio的同步,這樣會造成檔案指標混亂,進而導致re

既然noip比賽中堅決不要寫std::ios::sync_with_stdio(false),那麼我們可以用scanf

時間變成了0.641s,相比無優化的cin還是較快的

我們知道,getchar的速度是很快的,但它只能讀取單個字元,因此,我們通過將字元轉為整型來優化,同理可以轉成long long

快速讀入的**noip初賽曾經考過

#include

#include

#include

using

namespace

std;

int a[1005][1005];

inline

int read()

while(c>='0'&&c<='9')

return x*sign;

}int main()

}printf("time used=%.3fs\n",double(clock()-s)/clocks_per_sec);

}

執行後的結果如下:

現在這個方法只需0.163s,比其他的方法都快,而且不會在評測機上出現問題,並且也沒有呼叫許多函式

遇到資料量大的題,盡量用手寫的快速讀入來讀取

遇到大資料時盡量避免用cin

noip比賽中堅決不要寫std::ios::sync_with_stdio(false)來優化cin

如果是double或輸入格式較複雜用scanf

遇到資料量大的題,且是long long或int,盡量用手寫的快速讀入來讀取

NOIP比賽中如何加速c 的輸入輸出

noip比賽中如何加速c 的輸入輸出 由於部落格遷移的原因,本部落格已經遷移到在競賽中,遇到大資料時,往往需要更快的讀取方式。由於比賽中輸出一般規模較小,本文只討論輸入如何加速.現在我們生成1000000個隨機數,構成1000 1000的矩陣,然後輸入比較時間 win 10系統 可以看出,cin的用...

C 加速輸入的幾種方法

在c 中,cin和cout的速度其實不並不慢,c 中的流的io速度相當的快,其速度與初始設定的快取區大小和硬碟的io速度有關。但在c 中,為了相容c的io scanf和printf cin和cout被設定為與c的io同步,這樣導致cin和cout的速度不如scanf和printf快。另外,在預設情況...

C 中如何接收輸入的字串

注意到c 課本中關於接收使用者輸入的字串都是用的字元陣列,看著極為不舒服,所以試了一下直接用string變數接收,發現沒問題,如下 1 include2 include 3using namespace std 45 intmain 6 注意引入string庫函式 另外注意到上面直接輸入遇到空格就終...