C++暴力指南

ComputerEngine發表於2024-03-22

關於暴力做法

暴力,非常直白的就是直接硬做,不管他迴圈有多大,不管他資料量有多大。你要記住的一個事情就是,暴力只面向小資料,但是必定能得到正確解(前提當然是你沒寫錯)甚至你需要進行對拍的時候你也得先寫一個暴力出來才能方便對拍。
但是也因此,為了儘可能的偷分,暴力裡要做盡可能的比較常數級別的最佳化,不要小看了這些常數級最佳化,說不準就能幫你多拿下一個邊界上的資料點。在這裡也可以大概的概括一些常見的最佳化思路:

剪枝

不該做的事情就要立刻停手,既然能透過當前條件推斷出後續步驟已經不對,那就不要浪費無用功,每一次計算都是在消耗我們寶貴的暴力時間。甚至有些簡單題就是考你如何有效剪枝,防止他搜太多直接TLE了。

各類快速運算

就算你不明白題目原本要什麼演算法,你也應該至少掌握一些常規的快速計演算法。例如位運算,快速冪。尤其是位運算,別小看了位運算的效率。例如我現在寫有:x = x/2;,在做暴力的時候不如直接改寫為x = x>>1;,你可能會說,這兩個的最終結果都一樣,何必呢?問題在於除法的單次計算效率真不如直接單次位運算快,屬於常數級別的最佳化手段,在一些比較邊界的資料條件會有玄學效應讓你有可能過掉一個資料點。

STL

STL永遠是你的好幫手,你永遠不能忽視STL的作用,它能在你對演算法一無所知的情況下仍然幫你實現功能。STL作為C++選手最強大的優勢,該利用就好好利用。在這裡列舉一些常用的STL

sort();  //排序
next_permutation();  //列舉全排列
vector<> ;  //自動擴容的陣列
queue<> ;  //佇列
stack<> ;  //棧
priority_queue<> ;  //優先佇列,會自動幫你排序,本質是個堆
map< , > ;  //對映,幫你自動做對映
hash_map< , > ;  //雜湊表,如果你不想自己構建的話,和map有點類似,但是速度比map還快

暫時想到這些,等以後想起來還有什麼再做補充

相關文章