CPE 一星 49 題 — 上機特訓
整理自 UVa / ZeroJudge 歷年「一顆星」題,依 9 大題型分類。語言:Python。目標:穩過 Level 1,進攻 Level 2–3。
考試格式提醒。 CPE 一場考 7 題、3 小時,難度為 ★×3、★★×2、★★★×1、★★★★×1,每題只有「對/錯」。對 1 題 = C 初級、2 題 = B 中級、3 題 = A- 進階級。這 49 題全是一星題 ★ —— 練熟它,至少吃下考場那 3 題一星。完整報名/評分/合格標準看 考試資訊。
為什麼用 Python,這站怎麼用。 Python 整數無上限,大數題(10055、10929…)直接做、不必煩惱溢位。用法很簡單:到「題庫」把每題照 讀懂 → 默寫 → AC → 隔天再默 跑一輪,狀態會自動記錄。建議先看「讀書方法」3 分鐘,再背「Python 起手式」,下手就不卡了。
選一個題型開始
不必照順序 —— 從你最有把握的題型先拿下,建立手感。點卡片直接進入該題型的練習。
關於這個網站
這是一個為了準備 CPE(大學程式能力檢定)而做的個人學習輔助站:把歷年「一顆星」常考的 49 題依題型整理,附上題目、思路與可執行的 Python 解法,幫你穩拿 Level 1、進攻 Level 2–3。
- 免責聲明:站內題目敘述是自行整理的摘要、解法為學習參考用;實際題目、測資與考試規定一律以 官方網站與原題為準,不保證完全無誤。本站為非官方網站,與 CPE 主辦單位無關。
- 你的進度:預設只存在你自己的瀏覽器(localStorage);只有在你主動「建立同步碼」後,才會把進度上傳雲端,用來讓手機/電腦同步。也可用頁尾的「匯出/匯入備份」手動搬移。
- 致謝與來源:49 題是 CPE 廣為流傳的「一星必考」題庫;題目與判題來自 UVa Online Judge 與 ZeroJudge;考試技巧參考多位考生的公開分享。每題解法都在本機用官方範例測過。
- 著作權與聯絡:題目著作權屬原作者/UVa Online Judge;本站僅提供自行整理的摘要與原創解法供學習之用。若你是內容權利人,或對任何內容有疑慮,歡迎來信告知,我會儘速處理或移除:(電子郵件載入中…)
歡迎自由分享給需要的同學,祝大家都順利通過 CPE。
CPE 考試資訊 & 合格標準
先搞懂遊戲規則,目標才會清楚 —— 知道「對幾題=什麼等級」,再開始練最有效率。
這是什麼考試
CPE(Collegiate Programming Examination,大學程式能力檢定)由「大學程式能力檢定委員會」主辦、多所大學協辦提供考場。台灣許多大學資工系把它列為畢業門檻。考的是程式設計、資料結構、演算法與解題能力。
報名方式
- 對象與費用:大專在學學生(含研究生)免費;社會人士 500 元。
- 怎麼報:先到官網註冊帳號 → 報名該梯次,全程線上。
- 官網:中山大學 CPE、銘傳大學 CPE(各梯次的報名與考試時間、考場以官網公告為準)。
- 多久一次:一年約 4 梯,通常是 3、5、10、12 月的星期二(例如 2025 年為 3/25、5/20、…、12/9)。同一梯由多所大學協辦、有很多考場,所以看起來場次很多,其實是「同一次考試、在不同學校舉行」—— 你挑離你近的考場報名即可。確切日期一律以官網最新公告為準。
考試形式
- 時間題數:3 小時、7 題。
- 難度分布:★×3(一星)、★★×2、★★★×1、★★★★×1。這個網站的 49 題練的就是那 3 題一星 ★。
- 可用語言:C / C++ / Java / Python。
- 考場規則:不能攜帶任何資料、字典、書包、食物、手機、電子媒體進場。
評分方式(ACM-ICPC 制)
- 每題只有「對 / 錯」,滿分 7 分(7 題)。
- 排名先比答對題數;題數相同再比罰時=每題從開始到答對的分鐘數,加上該題每次錯誤提交 ×20 分鐘。
- 對「拿到第幾級」來說只看答對幾題,罰時只影響排名。但仍建議:沒把握別亂交,每次 WA 都會累積罰時。
合格標準(成績等級)
CPE 依你答對幾題給等級,可上網申請成績證明(每份 NT$100)。下表為官方對照:
| 等級 | 英文 | 答對題數 | 能力說明 |
|---|---|---|---|
| C 初級 | Beginner | 1 題 | 具簡單程式編寫能力 ← 你的最低目標 |
| B 中級 | Intermediate | 2 題 | 能用程式處理簡單問題(常見畢業門檻) |
| A- 進階級 | Advanced | 3 題 | 能用程式解決一般常見問題 ← 你的進攻目標 |
| A 專業級 | Professional | 4~5 題 | 熟悉基礎演算法與資料結構 |
| A+ 專家級 | Expert | 6 題以上 | 熟悉各種進階演算法與資料結構 |
| F 零級 | Zero | 0 題 | — |
所以你的策略很合理。 把這 49 題(全是一星 ★)練熟 → 考場那 3 題一星至少吃下 1~3 題 → 穩拿 C 初級 ~ A- 進階級。先求對 1 題(C 初級),有餘力再往上。各校畢業門檻不同(常見「一次過 2 題」或「累計過 3 題」),實際以你自己學校規定為準。
題庫 · 9 大題型 · 49 題
每題附 ZeroJudge 連結(可交 Python)與思路提示。練到能「蓋住範例、自己默打一次就 AC」就標「已熟練」。
讀書方法
為什麼「默寫」比「死背」有效 —— 給「會寫但常卡住」的你。
CPE 一星題會「換數字、換包裝」,背字元沒用,要背「套路」。把每一題練到能「蓋住範例、自己重打一遍並 AC」,這同時就在訓練你的邏輯。每題都照下面四步跑一輪:
點「去做題」看原題,特別盯死 輸入/輸出格式(一星題最常死在格式,不是邏輯)。
看一份正解,逐行問自己「這行在幹嘛」。卡住就回來看卡片上的思路提示。
關掉範例,自己重打、送出,直到 AC。錯了先看判題回饋(WA/PE/TLE)對症下藥。
AC 了標「練習中」;隔 2~3 天再默寫一次,還能一次過就標「已熟練」。
6 週衝刺排程(每天 2 題就好,重質不重量)
題型 1·2·3
公式 / 進位 / 整除 —— 最簡單、CP 值最高,先建立信心。
題型 4·5
字串 / 字元頻率統計。
題型 6·7
排序 / 模擬 —— 考場最常出,重點練。
題型 8·9 + 弱項
幾何 / 雜項 + 全部默寫第二輪。
限時模擬
找一份歷屆,計時 3 小時只攻一星題。
心態
考場先挑「會的」做、先拿下一星題再說;某題卡住超過 15 分鐘就先跳下一題,最後再回頭。你的目標是先過 Level 1,不是把每題都解完。
內容依據。 這套方法建立在通用的學習科學 ——「默寫」即主動回憶(active recall)、「隔幾天再默」即間隔複習(spaced repetition),兩者都有記憶研究支持;再結合競賽程式常見的「重刻、AC 後回頭」練法,並針對你的情況(Python、會寫但常卡、先求過一星)調整。不是抄自某份補習資料。
解題反射 · 看到什麼 → 想到什麼
CPE 一星題比的是「反應速度」。把下面的「訊號 → 反射」練到看一眼就有直覺,考場就不卡。
① 最先看:輸入「怎麼結束」
拿到題目,第一件事不是想演算法,而是先決定怎麼讀輸入。看輸入說明的這幾個字:
| 看到這個 | 立刻反應(讀法) |
|---|---|
| 第一行是一個數字 T(測資組數) | n = int(input()) 再跑 n 次;或一次 sys.stdin.read().split() 慢慢取 |
| 沒說有幾筆、給到結束為止 / read until EOF | for line in sys.stdin:(讀到檔尾) |
| 「讀到 0 結束」「讀到 0 0 結束」「直到某特殊值」 | for line in sys.stdin: + 遇到那個值就 break(哨兵值) |
| 每組分成好幾行、數字散在多行 | 乾脆 sys.stdin.read().split() 一次全讀,用指標一個個拿,不管它換幾行 |
② 數據「範圍」的反射 ★ 你問的重點
| 看到這個 | 立刻反應 |
|---|---|
| 數字超大(2³²、10¹⁵、上千位、very large / big number) | Python 整數無上限,直接算就好!這是你選 Python 最爽的地方(C/C++ 要煩惱溢位或寫高精度,你不用) |
| N 很小(N ≤ 100、N < 500、Q < 21…) | 放心暴力:雙層迴圈 O(N²)、甚至 O(N³) 都跑得動,別想複雜解法 |
| 範圍超大、不可能一個個枚舉(如 D < 10¹⁵) | 不能暴力 → 改用公式 / 二分搜 / 數學推導(例:10170 旅館用二分搜) |
| 要判完全平方、開根號 | 用 math.isqrt,不要用 n ** 0.5(浮點誤差在大數會算錯) |
| 沒給明確上限 | 通常就是「讀到 EOF」,而且量可能大 → 用 sys.stdin 快讀,別用慢的 input() 迴圈 |
③ 輸出「格式」的反射(CPE 最常因這個 WA)
| 看到這個 | 立刻反應 |
|---|---|
| Case X: / Test #k: / Pair #k: / Field #k: | 要編號(從 1 開始);井號、冒號、空格全部照抄 |
| 「小數點後 N 位」 | print(f"{x:.4f}") 這類(把 4 換成題目要的位數) |
| 1 個 vs 多個用字不同(operation / operations) | 單數、複數分開處理(10035 就是這陷阱) |
| 多筆測資之間空一行 | 記得在組與組之間印空行(最後一組後面通常不用) |
| 固定句子(Jolly、impossible、… is prime.) | 大小寫、標點、句點一字不差 → 直接把題目的字串複製過來 |
④ 看到「關鍵字」→ 反射題型 / 工具
| 題目出現 | 反射 |
|---|---|
| 各位數字和、數根、被 9 / 11 整除 | 拆每一位數字(大數就當字串逐字元處理) |
| 進位制、base、二進位 / 十六進位 | bin(n)、int(s, base)、除基取餘 |
| 質數 / prime | 寫 is_prime(只試到 √n) |
| 最大公因數 / gcd / 互質 | from math import gcd |
| 排序、第 K 大、中位數、自訂順序 | sorted(..., key=...);中位數=排序後取中間 |
| 相鄰交換、最少交換次數 | 數逆序對(前面比後面大的配對數) |
| 格子、地圖、周圍 8 格、踩地雷 | 二維陣列 + 八方向 dx/dy,記得檢查邊界 |
| 機器人、骰子、依指令一步步、模擬 | 用變數記住目前狀態,照規則一步步更新 |
| 字元出現次數、頻率統計 | from collections import Counter |
| 字串替換、解碼、比對 | 逐字元掃描 + 建對照表 (dict) |
| 座標、距離、平行四邊形、角度 | 幾何公式 / 向量(如第四點 = A + C − B) |
| 星期幾、日期 | 算「一年的第幾天」再 % 7 |
⑤ 萬用三步驟(拿到任何題目,先這樣做)
⑥ 整份考卷的戰術(綜合考生心得)
| 拿到考卷 | 立刻反應 |
|---|---|
| 前 3 題幾乎就是那 3 題「一星」 | 一開始全力攻前三題,暴力法多半就能過(對應 ②「N 小就暴力」) |
| 後面 4~7 題 | 常還藏一題「水題」(送分) → 別卡在第 4 題硬幹,先把 7 題全掃一遍,挑最好做的先做 |
| 不知道從哪開始 | 每場通常至少一題來自這類一星題、甚至重複歷屆 —— 你練熟這 49 題的 CP 值就在這 |
| 時間快到、還差一題 | 考完立刻知道答對幾題;多 AC 一題就多拿一級,別提早放棄 |
怎麼練:之後每點開一題「看解法」,先別展開程式碼 —— 先用上面這套問自己「輸入怎麼讀?範圍給了什麼提示?是哪個題型?」,反射出方向後再點開對照解法。練幾天,看一眼題目就有感覺了。
內容依據。 ①~⑤ 的反射是我從這 49 題實際解題歸納 + 競賽程式通用直覺;⑥ 與部分實戰技巧參考考生分享並交叉比對。延伸閱讀:培哥的 CPE 筆記、從 1 題到 7 題心得、Dcard CPE 心得。
Python 起手式
一星題真正卡人的是「輸入怎麼讀」,不是邏輯。把這幾招背起來,下手就不卡。
三種輸入範本(背起來,大半題目都用得到)
① 讀到 EOF、逐行處理(最常用)
import sys
for line in sys.stdin:
line = line.strip()
if not line: continue
# 處理這一行
② 第一行是測資數 T
import sys
data = sys.stdin.read().split()
i = 0
T = int(data[i])
i += 1
for _ in range(T):
# 從 data[i] 取值,i += 1
③ 全部數字一次讀進來(量大最快)
import sys
nums = list(map(int,
sys.stdin.read().split()))
示範:把最簡單的 10055 完整跑一遍
題目:每行兩個數,輸出兩數差的絕對值,讀到 EOF。這就是「起手式 ①」+ 一行邏輯:
import sys
for line in sys.stdin:
line = line.strip()
if not line: continue
a, b = map(int, line.split()) # 切開、轉成兩個整數
print(abs(a - b)) # 差的絕對值,5 行可 AC
注意:題目數字可到 2³²,C/C++ 要用 long long,Python 完全不用管 —— 這就是你選 Python 的甜頭。
考場 3 鐵則
- 多筆測資讀到 EOF:用
for line in sys.stdin:,別用會卡住的input()迴圈。 - 輸出的空白、大小寫、每行結尾要跟題目一模一樣(差一個空白就 PE/WA)。
- 浮點輸出用 f-string 控制小數位,例如
print(f"{x:.2f}")。
考前衝刺
最後一週與考試當天的檢查清單。
考前一週
- 到 CPE 官方歷屆 找 1–2 份,計時 3 小時只攻一星題,模擬真實節奏。
- 把「Python 起手式 ①」默寫到不用想就能打出來。
- 9 個題型,每型至少有 1 題能「蓋住默寫、一次 AC」。
- 確認你那一梯的考生使用手冊:Python 版本、交題流程、可否帶任何東西。
- 先到判題系統「瘋狂程設」跑一兩題,熟悉交題介面與流程(Python 也支援),別考場才在摸。
- 報名後別無故缺席(會取消下一次資格)、更別作弊(該次 0 分並取消之後三次資格)。
考試當天
- 先掃一遍 7 題,從最有把握的一星題下手,先拿下 Level 1 再說。
- 每題先確認輸入/輸出格式範例,再動手。
- 某題卡超過 15 分鐘 → 先跳下一題,最後再回頭。
- 送出前自己用題目的範例測一次,對得起來再交。
- 考場只能帶身分證明、筆、紙本注意事項、PC 編號紙條;手機、書、隨身碟等放書包。考完即時知道答對幾題。
記住:你只要對 1 題就達標了。把這 49 題的手感練出來,那「保證會出的一星題」就是你的分數。穩住,祝你上岸。