※ 引述《cplusplus (大口小口吃炒飯)》之銘言:
: : 最後CPU time 0.422、memory 388,和你說的差不多
: : 謝啦
: : 我再研究看看有沒有更快的方法
: : 排名第1的是 CPU Time Memory
: : 0.049 64
: 把以前寫的叫出來看
: if(value<101) ans=91;
: else ans=value-10;
: 也沒什麼數學
: parse 數字 我是自己 parse
: 速度 0.295 參考看看
: 改成上面的試試看 應該會比較快吧
基本上,很多題目的io時間都站蠻大的比例
我想那些速度快過基本c++ io操作的,應該都是用到asm來搞io
那真是太累了,建議可以用c的io,一般來說速度會快一點
通常我都是一次讀進buffer再來處理,
這樣可以減少io functions的呼叫,連續處理起來也比較快速,應該會利用到PIPELINE
像上面提到一直使用getchar,我想會比較慢,我是用gets來一次讀進一整行
gets不是安全的function,一般來說建議使用fgets,不過既然是acm,就沒差了
為了速度,就用gets,輸入比較快速,之後再自己parse,這些都比用scanf快
也如前面所說,printf,scanf都需要parse參數,可能會造成bottlenack
像是這一題,我使用cout的速度就比printf快多了,有點反常,
改天再來測試看看C++的I/O VS C的I/O,也許並不是某一邊全勝
基本上我認為C++的IO可以比C的快,因為C++對不同型態輸入使用overload,
應該只是呼叫正確的function,如果是inline functions的話,應該速度會很快
因為C的需要parse 參數,需要不少工,應該會比C++慢,
不過大家都知道C++的IO是class based,且有複雜的繼承機制,會有不少overhead,
加上IO是很頻繁且不簡單的動作,用成inline也不太合適,可能是慢的原因,真是可惜了
不然如果只是單純地輸入且依形態各自parse,配上inline,應該不會有overhead
且對我來說C++的IO方便多了,不過為了速度,通常會搭配C的IO來使用
同常會這樣改
//read a line
string str; char str[MAX_LEN];
getline(cin,str); gets(str);
or
char str[MAX_LEN];
cin.getline(str,MAX_LEN);
//read a char
cin.get(); getc();
//read many variables
cin>>a>>b>>c; scanf("...",&a,&b,&c);//為了更快可以自己PARSE
//parse arbitrary number variables from a line
string line; char str[MAX_LEN];
getline(cin,line); gets(str);
istringstream in(line.c_str()); char *token=strtok(str," ");
while(in>>a) while(token!=NULL)
{ .... } { .....
token=strtok(NULL," ");
}
通常都是C比較快的,至於OUTPUT我就不太清楚了,好像差不多吧
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.81.235.78