# PCCA Winter 一般組 Day 1 練習賽 參考解答 ## A. Simple Base Conversion - **看清楚題目和測資的大小寫和範圍!** - 對於 `<cstdio>`,`%i` 可以自動判斷輸入的整數是 16 進位或 10 進位並存入 `int` 型別中,再自行判斷後用 `%d` 輸出 10 進位和 `%X` 輸出 16 進位(大寫字母)即可。 - `<ios>` 中有 `std::showbase`、`std::hex`、`std::dec`、`std::uppercase` 等物件可以使用,如: ```c++ cout << hex << uppercase; cout << "0x" << 44 << endl; ``` 會輸出: ```c++ 0x2C ``` - 如果使用 `cin`, `cout` 的同學,請在 `main` 函數一開始加上以下程式碼,避免超時。 ```c++ ios_base::sync_with_stdio(false); cin.tie(NULL); ``` - 題目敘述中提到是非負整數,小心輸入為 `0` 或 `0x0` 的狀況。 ## B. Kindergarten Counting Game - 輸入一整行之後再處理。 - 注意開頭和結尾的一些特殊狀況! ## C. The Playboy Chimp - 二分搜 ## D. Rotating Sentences - 請小心處理換行字元,不要輸出多餘的空白! ## E. Solve It - 發現單調性。 - 答案只要求到小數點後第四位。 - 比較兩個數字是否相等時,可以接受非常小的誤差。 - 即: $|a-b| \le \varepsilon$ 但因為 $\varepsilon$ 太小所以我們忽略,仍然可以視為 $a=b$ 成立。 ## F. Marvelous Mazes - 字串處理 ## G. Where's Waldorf? - 字串處理 - 同 A,使用 `cin`、`cout` 時請注意速度。 ## H. Humidex - 二分搜 - 單調性 - 同 E,請注意浮點數運算的誤差。 ## I. Broken Keyboard (a.k.a. Beiju Text) - 開一個陣列 $O(n)$ 檢查,每次移動指針時(Home, End, Next)把下一個字元映射到指針位置的陣列格中。 - 另解:linked-list ## J. Monthly Expense - $N+1$ 個數的數列分成連續的 $M$ 個區間,使最大區間和最小。 - 二分搜答案,並且爬行法 $O(n)$ 是否有合法的分法。 ## K. The Monkey and the Oiled Bamboo - 二分搜答案,按照題意 $O(n)$ 檢查是否合法。 ## L. Product - 數字範圍到 ${10}^{250}$,也就是兩個 $250$ 位數相乘,直式乘法:$O(n^2)$,$n \le 250$。 - 兩個最大到 ${10}^{250}$ 的數字相乘,最大會到 ${10}^{500}$。 - 如果寫不出大數乘法,開其他程式語言也是不錯的選擇。