iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

認識我的人應該都知道,我高中是新竹中學程式競賽的隊長跟助教,大學也持續有在打比賽(前陣子有幸拿了一場小比賽的冠軍),所以今天的主題,我想來分享一些常見的競賽很常使用的一些小技巧。

IO優化

int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(false);

}

由於C++的輸出輸入向下兼容C輸出輸入,所以其實執行上速度是比較慢的。

但如果把這兩行加上去,就可以把速度提升10倍,直接超級加速。(但使用後就沒辦法混用cout跟printf、cin跟scanf了喔)

#define int long long

#define int long long

由於有時候題目會故意讓運算上會溢位,所以我們要使用long long。

但偶爾還是會忘記,所以乾脆直接在最剛開始寫上一句#define int long long,就完全不怕忘記把int改成long long了。

遍歷輸出陣列

for(int i-0;i<n;i++){
	cout<<a[i]<<" \n"[i==n-1];
}

有時候題目會要求我們輸出一個陣列,中間以空格隔開,最後要斷行(但最後面不能有空格)。

這個寫法是利用一些神奇的字串作法來很漂亮的完成這項任務,感興趣的同學可以自己再多研究看看喔!

Leak

比賽的時候,送出程式碼後除了程式執行結果(AC、WA、TLE…),我們還可以知道這個程式的記憶體使用量、程式執行時間等等。

很多人都忽略了這些細節,但其實這有時候可以幫助我們「繞過問題得到答案」。

舉例來說,我們可以把題目的輸入進行hash成一個數字,然後再delay這個秒數,我們就可以利用這個方式從程式執行時間來偷出測資,也就可以有方法利用這些資訊來解決題目。

打表

如果你的運算時間太久,不妨在自己電腦先進行運算出來,然後把值存在程式碼裡,這樣就可以減少很多執行時間啦。

判環方法

有時候判斷圖有沒有環的方法,不一定是要用神奇的演算法來解決。

不妨試試看直接dfs下去,如果走了上萬層,那很可能就代表你有進到環啦。

DFS

對於所有有解的問題,肯定可以使用窮舉把所有可能列出來。

如果真的想不到更好的演算法,不如就使用DFS試試看能不能拿到部分分數吧!

無解

有時候題目寫「如果無解請輸出-1」,如果你真的還是沒有想法,就直接丟個輸出-1試試吧。

說不定可以得到部分分數,或者至少證明了這個題目一定有解。

結語

不過這些方法都只是一些技巧,有些只不過能幫你得到一些分數,打鐵還需自身硬,還是要努力學習及刷題,遇到題目也要真的有能力解決。

不騙分,才是騙分的最高境界!

本期meme

https://ithelp.ithome.com.tw/upload/images/20231005/20133574Q91QzZlp08.jpg


上一篇
Day20 開源節流
下一篇
Day22 區間範圍
系列文
寫程式的那些宗教戰爭30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言