20180210-NCTU-PCCA-winter-notes
NCTU PCCA winter
快速索引
一般組
- Day 1: 二分搜尋法 (pdf) (上機練習) (題解)
- Day 2: 資料結構&STL (slide) (上機練習) (題解)
- Day 3: 暴力法 (slide) (上機練習) (題解) (影片)
- Day 4: 貪心法 & 分治法 (slide) (上機練習) (題解) (影片)
- Day 5: 動態規劃 (slide) (上機練習) (題解) (影片)
進階組
- Day 6: 貪心法 (pdf) (上機練習) (題解) (影片)
- Day 7: 數學工具 (slide) (上機練習) (題解)
- Day 8: 自動機與字串們 (slide) (上機練習) (題解)
- Day 9: 高級的 DP (slide) (上機練習) (題解)
- Day 10: 高級的圖論 (slide)
二分搜 Day1
整理筆記
演算法 Big O 時間複雜度
- 二分搜尋 快速找東西,全部找過一遍 O=n 單調性 輸入:一堆有單調性的資料 輸出:符合條件的第一筆或最後一筆 作法:每次取中間值,尋找範圍小一半 big O(log n)
int Binary_Search () { int L=0, M, R=INF; while (R-L >1) { M=(L+R)/2; if (check(M)) { L=M; } else { R=M; } } return L; }
競賽會評估時間複雜度,簡單解法比較好
輸入輸出 C-style input/output
格式化 scanf fscanf sscanf
格式化輸出 printf fprintf sprintf
非格式化輸出gets(remove from C++14 fgets
非格式化輸出 puts, fputs
直接輸入輸出 getchar, putchar
Formatted i/o
%% 一個% %c 一個字元或一堆資院 %s 一個沒有空白的字串 %[set] 一個只包含 set 的字元的字串 ,若要寫成不包含 :%^[set] Ex %[^0-9] 存一個沒有 0-9 的字串 %[][] 右括弧先 %d %i %u(無符號) %o %x 一個整數 %0d 可以輸出 binary %a %e(十進位科學記號) %f %lf(倍準) %g 一個符點數 scanf 吃進的東西是 pointer %-3d 靠左-3 格 %f.1 小數點後一位 ex %010.3f 補 0 補到 10 格 stream-base i/o std::cin, std::cout std::getline std::iostream::getline <iomanip>:std::setw std::setfill std::setprecision
常見題型 輸入 t 筆測資,輸出到底幾位 輸出直到 eof EOF:檔案結尾 EOF=-1 是一個巨集
二分搜 要有單調性
輸入整行字串
fgets(word, 128, stdin);
getline(cin, name);
輸入以空白分隔的數列
sscanf
string stream (c++)
檔案輸入輸出
freopen
fopen
c++
fstream
cplusplus.com
&a 對 a 這個變數取位置
while(t--) { xxxx }
scanf return 1 2 -1(EOF) while (~(scanf())) 等同於 while (scanf()!=-1)
EOF ctrl D linux/ ctrl Z windows
using namespace std; c++ cin cout cin >> n; cin >> n >> m; cout << n cout << sum << '\n' << flush cout << sum << endl
gets puts
fgets(buffer, 128, stdin)
getchar putchar
stdin stdout stderr
c++
string s;
getline(cin,s);
會自己分配記憶體
cin.getline() ???好像很類似 scanf ,會跳過 space
換行
getchar
windows \r\n
linux \n
sscanf(str, "%d", )
c++
#include <iostream> stringstream ss; ss << input ; while (ss>>num) {} cout << num << endl
Ex stringstream ss(s) while (ss >> a)
c++ auto 型別 ex auto f = fopen("in.txt", "r");
ifstream fin("in.txt") fin.close()
cin cout VS printf scanf cin cout 速度其實差不多,但有時比較慢 字串會差不多, 時間會有差是差在 endl 因為中間會跑很多層,會累積到一定數量再輸出 c++ 裡,加上 endl 會清掉
cout << n << endl
ios_base::sync_with_std(false); 只能用 c 或 c++ cin.tie(NULL); 不要和 endl 同時用 加上面兩行可以加快速度
資料結構&stl Day2
窮舉法 Day3
遞迴 迴圈 考慮一個 int x,算 x^n mod m 觀察規律 n&1
inline int f(x) { return x\*x; }
暴力演算法 快速冪(較難) 剪枝
八后問題 雙向 BFS
分治法 Day4
快速冪 合併排序
- 分解 左子 右子
- 解決 數列剩一個元素,甚麼都不用做
- 合併 左右都排序好,甚麼都不用做
最近點對
- 分解 分成 n/2 的左右半邊
- 解決 答案是只剩兩點的距離
- 合併 答案有三種,左半、右半、跨邊點對 把三種可能的答案取 min 題目 - 10245 - 10750 - 11378 - Codeforce 429D
DP Day 5
1<n<10^5