基礎演算法

Online Judges

常見的OJ

常見的OJ/比賽網站

不常見的OJ

複雜度

Big-O Notation

  • 用 Big-O 來表示演算法的效率
  • 兩個複雜度相同的演算法執行時間差異不會太多
  • Big-O 表示演算法效率正比於該函式

在競賽程式的意義

執行時間跟複雜度大概可以對應到下面這張圖

在競賽程式的意義

  • 複雜度算出來希望可以在 \(10^7\) 以內
  • 實際執行時間取決於常數,但影響較小

DP

費波納契數列

$$F_n = F_{n-1} + F_{n-2}$$ $$F_1 = F_2 = 1$$

求 \(F_n\)

遞迴?

複雜度是 \(O(F_n)\)

從一般項可知這是指數級的複雜度

int fib(int n){
    if (n == 1 or n == 2) return 1;
    else return fib(n-1) + fib(n-2);
}

DP!

從 \(F_3\) 開始算,一路算到 \(F_n\)

每天有三件事可以做,第 \(i\) 天做分別獲得 \(a_i, b_i, c_i\) 快樂度

連續兩天不能做相同的事

\(n\) 天下來最多可以獲得多少快樂度

給定一個整數序列

求出最大的某一段區間的和

Greedy

貪婪演算法

  • 在每一步都使用當下最優的策略
  • 有些題目這樣就會給出最佳解

有 \(n\) 個東西分別重 \(w_i\) 要合併為一個

每次可以取兩個東西合併,合併完的重量為兩者相加

花費則是合併完的重量

最少需要多少花費才能全部合而為一

證明正確性

  • Proof by AC
  • 反證法

反證法

  • 證明對解做任何更改都不可能變好
  • 有 \(n\) 個人要吃飯
  • 每個人吃飯跟做菜的時間是給定的
  • 廚師一次只能做一個人的菜
  • 大家可以同時吃飯,而且菜做好馬上就可以吃
  • 你可以決定廚師做菜順序,讓最後一個人吃完飯的時間越早越好
  • 經典Greedy題

有許多線段,你必須選擇一組不重疊的線段

並使選到的線段越多越好

排序 Greedy

有些 Greedy 題的結論就是按照某種規則排序就好了

apcs 物品堆疊

二分搜

\(1 \sim 100\) 間有個神祕數字

每次可以猜一個數字

你會得到神秘數字大於、等於、或小於猜的數字

最佳策略下最多要猜幾次才會得到答案

Ans:

\(\lfloor \log_2(100) \rfloor\)

例題

內建的二分搜

找到大於等於 \(x\) 的第一個數

int i = lower_bound(a, a+n, x) - a;

若改為upper_bound則是大於 \(x\) 的第一個數

二分搜應用

  • 對答案二分搜
  • 數學

對答案二分搜

  • 題目要求達成某件事的最小/大花費
  • 計算特定花費下能不能達成很簡單

筆直的道路上有 \(n\) 個服務點

可以在任何點架設服務範圍為 \(r\) 的基地台

在只能設置 \(k\) 個基地台的情況下

\(r\) 至少需要是多少

對答案二分搜

  • 答案呈0000011111或反過來
  • 單調性

習題

分治

分而治之(Divide and Conquer)

  • 將問題分成兩半
  • 分別解決
  • 再嘗試合併兩邊的答案

Pseudo Code

void solve(int L, int R){
    if (L == R) return;
    
    int m = (L + R) / 2;
    solve(L, m);
    solve(m+1, R);
    /*
        do stuff
    */
}

經典分治

  • Merge Sort
  • 逆序數對問題
  • FFT

複雜度

  • 主定理
  • 每層花 \(O(n)\) 解決,通常整體來說需花 \(O(n\log n))\)
  • 詳細的複雜度詳見主定理,但它很難

Merge Sort

\((1, 7, 8, 3, 4, 5, 6, 2)\)

\(\rightarrow (1, 7, 8, 3), (4, 5, 6, 2)\)

\(\rightarrow (1, 7), (8, 3), (4, 5), (6, 2)\)

\(\rightarrow (1), (7), (8), (3), (4), (5), (6), (2)\)

\(\rightarrow (1, 7), (3, 8), (4, 5), (2, 6)\)

\(\rightarrow (1, 3, 7, 8), (2, 4, 5, 6)\)

\(\rightarrow (1, 2, 3, 4, 5, 6, 7, 8)\)

單調隊列

單調性(Monotonic)

  • Bullet One
  • Bullet Two
  • Bullet Three

基礎演算法

By yungyao

基礎演算法

  • 262