ACM做題思路總結

2021-07-16 22:27:59 字數 2455 閱讀 3441

1. 對於在限制條件下的最優化問題,時間上優化的突破口也在限制條件。

eg 給

n條邊,從中選

3條拼成乙個三角形,要求周長最大的三角形

搜尋時各種剪枝策略

2. 為了設計演算法,

靈活的想象力(!!!)

演算法的基礎知識

也是必不可少的。

poj 1852 螞蟻爬桿

3. 對於標準庫已經實現了的函式,盡量呼叫庫函式,不要自己手寫。但是,自己一定要清楚如果要自己寫,需要怎麼寫

(binary_search)

。同時有的函式庫

(strstr)

實現效率很低,所以還是需要自己手寫。

4. 對資料合理的組織(排序,堆),是優化時間的常用方法,也是我們設計資料結構最重要的因素之一。

eg 因為多次查詢的需要,我們才對乙個字典進行排序,這樣每次查起來就快很多。如果只用查一次,那我就沒有必要對字典排序了。

5. 利用已經計算過的結果,是優化時間的最常用思想。

eg dp,記憶化搜尋,打表,都是用空間換時間

6. 凡是可以用狀態表示,有狀態轉移的問題,都可以轉化為圖的問題。

7. 搜尋演算法和動態規劃演算法,都是在多種策略中選取最優解,而貪心演算法則不同,它遵循某種規則,不斷的選取當前最優策略。

8. 競賽中,常常需要證明自己對問題的設想是否成立。當時間緊迫又缺少證明思路時,建議至少測試一些資料來驗證。另外,有些規律雖然對一般情況成立,卻不能很好處理一些

邊界情況。(即使找到了規律,也不要就此大意,最好充分考慮一下是否有特殊情況或反例)

9. 二分搜尋不只是查詢,還可用於最優解問題。假設結果為

x(這樣就多了乙個條件),然後二分這個

x,這樣就把最優化問題轉化為了判定問題。(有些問題做優化可能不知道如

何下手,但轉成判定問題就很簡單了)

eg 「求滿足某一條件的

c(x)

的最小(最大)

x」這一問題,只要

c(x)隨x

單調製化,那就可以用二分搜尋。

10.二分搜尋的結束判定,在輸出小數的問題中,最好用迴圈次數作為終止條件。

100次迴圈就可以達到

10^-30

的精度範圍,基本上沒有問題。

11. 最大(最小)化平均值問題,這種問題通常和二分搜尋結合,利用∑

vi/∑

wi >= x,

變形得到∑

(vi - x*wi) >= 0

,然後利用這個新條件。

12. 有些題目其實是找規律的題目,不要被題目複雜的條件,和很大的資料範圍(往往也說明了這些題是有規律的)嚇到。可以先從小規模樣例入手,還可以先解決去掉乙個限制條件的問題,通過這個思路再解決原問題。

13. 除了暴力外,拿到乙個問題,把大問題化成小問題解決,也是常見的第一思路。

14. 對於需要快速得到陣列中某一連續段的和(乘積,抑或等),都可以採用,先預處理出從第乙個數到第i個數的sum值,存放在陣列sum 中,然後第i到第j段值就是

sum(i~j) = sum[j] - sum[i-1]

(product(i~j) = product[j] / product[i-1])

(or(i~j) = or[j] ^ or[i-1])

15. 寫程式時用到運算子需要考慮的一些問題

(1) 一旦做乘法和加法(尤其乘法),就要考慮到會不會有整數溢位的現象,要用32位整數還是64位還是大整數

(2)一旦在有取模的運算中,做減法一定要考慮會不會出現負數,負數取模在不同的語言中結果是不一樣的,所以最好的做法是加特判。

(3)一旦有除法的運算,一定要考慮除數是否為0,有的話就要寫特判

動態規劃做題思路

1 計數 2 求最大值最小值 3 求存在性 一 確定狀態 1 最後一步 2 確定子問題 二 轉移方程 三 初始條件和邊界情況 四 計算順序 有2元,5元,7元硬幣,求組合成27元硬幣所用最少硬幣數。找出最後一步 最優策略是k枚硬幣a1,a2 ak加起來是27 最後一枚為ak,則前面的面值加起來是27...

ACM 推薦做題的OJ

1 特點 題目很多,對提交的結果有各種排序 執行時間 記憶體大小 長短等 可以對各種目標優化,有時候做題並不僅僅是為了ac,不是嗎?2 特點 介面較美觀,題目大部分比較簡單,適合我這種入門選手,而且可以看別人提交的 這對我來說是最重要的,不是為了抄襲,而是為了學習 偶爾參加比賽,獲得稍許成就感。出錯...

ACM做題小技巧《轉》

acm做題小技巧 轉 我的acm 博文來自 acm做題過程中的一些小技巧。1.一般用c語言節約空間,要用c 庫函式或stl時才用c cout cin和printf scanf最好不要混用。大資料輸入輸出時最好不要用cin cout,防止超時。2.有時候int型不夠用,可以用long long或 in...