認識我的人應該都知道,我高中是新竹中學程式競賽的隊長跟助教,大學也持續有在打比賽(前陣子有幸拿了一場小比賽的冠軍),所以今天的主題,我想來分享一些常見的競賽很常使用的一些小技巧。
int main(){
cin.tie(0);
ios_base::sync_with_stdio(false);
}
由於C++的輸出輸入向下兼容C輸出輸入,所以其實執行上速度是比較慢的。
但如果把這兩行加上去,就可以把速度提升10倍,直接超級加速。(但使用後就沒辦法混用cout跟printf、cin跟scanf了喔)
#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];
}
有時候題目會要求我們輸出一個陣列,中間以空格隔開,最後要斷行(但最後面不能有空格)。
這個寫法是利用一些神奇的字串作法來很漂亮的完成這項任務,感興趣的同學可以自己再多研究看看喔!
比賽的時候,送出程式碼後除了程式執行結果(AC、WA、TLE…),我們還可以知道這個程式的記憶體使用量、程式執行時間等等。
很多人都忽略了這些細節,但其實這有時候可以幫助我們「繞過問題得到答案」。
舉例來說,我們可以把題目的輸入進行hash成一個數字,然後再delay這個秒數,我們就可以利用這個方式從程式執行時間來偷出測資,也就可以有方法利用這些資訊來解決題目。
如果你的運算時間太久,不妨在自己電腦先進行運算出來,然後把值存在程式碼裡,這樣就可以減少很多執行時間啦。
有時候判斷圖有沒有環的方法,不一定是要用神奇的演算法來解決。
不妨試試看直接dfs下去,如果走了上萬層,那很可能就代表你有進到環啦。
對於所有有解的問題,肯定可以使用窮舉把所有可能列出來。
如果真的想不到更好的演算法,不如就使用DFS試試看能不能拿到部分分數吧!
有時候題目寫「如果無解請輸出-1」,如果你真的還是沒有想法,就直接丟個輸出-1試試吧。
說不定可以得到部分分數,或者至少證明了這個題目一定有解。
不過這些方法都只是一些技巧,有些只不過能幫你得到一些分數,打鐵還需自身硬,還是要努力學習及刷題,遇到題目也要真的有能力解決。
不騙分,才是騙分的最高境界!