在競賽中,遇到大資料時,往往需要更快的讀取方式。由於比賽中輸出一般規模較小,本文只討論輸入如何加速.
現在我們生成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庫函式 另外注意到上面直接輸入遇到空格就終...