奧林匹亞資訊班
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