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

2021-08-13 08:20:32 字數 2831 閱讀 4605

#noip比賽中如何加速c++的輸入輸出

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

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

可以看出,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的同步

我們來驗證一下:

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

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

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

爆0的原因如下

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

##scanf的速度

既然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

intread()

while

(c>=

'0'&&c<=

'9')

return x*sign;

}int

main()

}printf

("time used=%.3fs\n"

,double

(clock()

-s)/clocks_per_sec)

;}

執行後的結果如下:

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

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

##總結

遇到大資料時盡量避免用cinnoip比賽中堅決不要寫std::ios::sync_with_stdio(false)來優化cin如果是double或輸入格式較複雜用scanf遇到資料量大的題,且是long long或int,盡量用手寫的快速讀入來讀取

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

在競賽中,遇到大資料時,往往需要更快的讀取方式。由於比賽中輸出一般規模較小,本文只討論輸入如何加速.現在我們生成1000000個隨機數,構成1000 1000的矩陣,然後輸入比較時間 win 10系統 include include include using namespace std int m...

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庫函式 另外注意到上面直接輸入遇到空格就終...