奧林匹亞資訊班

5/31

講師:吳崇維(wayne)

開始之前

註冊 codeforce 以及 寫幾題熱身

Codeforce

 

一個國外的程式解題網站

有非常大量的題目資源

十分簡單

全世界只有2個人解的出來的都有

 

全網站都是英文,需要一點時間熟悉

 

以後練習題目主要都會在這個平台。

Codeforce

 

另外這網站有一個 ranking 機制

打一個線上的比賽可以加減積分

鍛鍊自己以及確認自己實力的好方法

 

不過時間大多在台灣時間的半夜。

Codeforce

 

先註冊一個帳號,並且寫兩題最多人

寫過的題目 : watermelon

 

https://codeforces.com/problemset/problem/4/A

https://codeforces.com/problemset/problem/1/A

演算法

演算法


對於一個固定形式的問題,

產生一套流程->

對於任何的輸入組合

皆能產生預期的答案!

推薦閱讀:)

如何分析一個演算法?

  • 他跑得夠快嗎?
  • 他夠節省嗎?

演算法速度!

 

想一想:如果一行程式跑1單位時間

 

 

 

這個for跑了~?

for (int i = 0; i < 10000; i++) {
    cout << "oops\n";
}

演算法速度!

 

想一想:如果一行程式跑1單位時間

 

 

 

那麼這個for跑了~?

for (int i = 0; i < N; i++) {
    cout << "oops\n";
}

演算法速度!

 

想一想:如果一行程式跑1單位時間

 

 

 

還有這個for跑了~?

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        cout << "oops\n";
    }
}
for (int i = 0; i < 10000; i++) {
    cout << "oops\n";
}
for (int i = 0; i < N; i++) {
    cout << "oops\n";
}
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        cout << "oops\n";
    }
}

跑了10000次,是固定次數

又稱常數時間

跑了N次,隨著N變大次數變多

又稱線性時間

跑了N平方次隨著N變大次數變多,且增多的很快

 

for (int i = 0; i < 10000; i++) {
    cout << "oops\n";
}
for (int i = 0; i < N; i++) {
    cout << "oops\n";
}
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        cout << "oops\n";
    }
}

跑了10000次,是固定次數

又稱常數時間

跑了N次,隨著N變大次數變多

又稱線性時間

跑了N平方次隨著N變大次數變多,且增多的很快

 

如果今天輸入量 N = 10000

電腦速度 (1秒)

  • 10^7 (10000000) 可以輕鬆跑完
  • 10^8  有一點點勉強
  • 3*10^8  非常吃緊
  • 10^9  基本上跑不過
for (int i = 0; i < 10000; i++) {
    cout << "oops\n";
}
for (int i = 0; i < N; i++) {
    cout << "oops\n";
}
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        cout << "oops\n";
    }
}

跑了10000次,是固定次數

又稱常數時間

跑了N次,隨著N變大次數變多

又稱線性時間

跑了N平方次隨著N變大次數變多,且增多的很快

 

如果今天輸入量 N = 10000

哪些跑得過,哪些跑不過呢?

算法 1

Brute Force (暴力搜尋法)

Brute Force

 

顧名思義,就是什麼都不管,時間複雜度什麼的都不重要,把最直接的想法雜進去就好,

所有的可能都搜尋過一遍

 

現實例子:暴力密碼搜索。

Brute Force

 

什麼時候可以用暴力搜尋呢?

 

1. 想法簡單容易實現

2. 時限上十分寬鬆

3. 輸入量級十分小

其中輸入量級是最重要的參考

假設 N = 100 ,則 n^4 (n的4次方)

這樣的恐怖時間複雜度都可以在一秒內跑完

例題 1:

https://codeforces.com/problemset/problem/271/A

思路 & Hint

若他給你 y 年,那可以從 y+1年開始列舉

也就是說,檢查y+1, y+2, ..., 直到檢查到符合題意的年份。

找到後輸出年份,終止程式!

例題 2:

https://codeforces.com/problemset/problem/122/A

思路 & Hint

試著將所有的包含有 4,7 並在範圍內的數字直接列舉出來

接著逐個檢查。

作業!

請AC以下幾題 (下週不上課)

  • https://codeforces.com/problemset/problem/231/A
  • https://codeforces.com/problemset/problem/158/A

FeedBack!

一起努力快樂寫程式吧!

class 5/31 演算法

By Wayne Wu

class 5/31 演算法

  • 80