題意:讀入 n 學生 (姓名、學號、分數),輸出最高分與最低分學生的姓名與學號。分數唯一,無並列。
核心邏輯:單次掃描維護 max/min 結構體。
struct Student { char name[15], id[15]; int score; };
// 初始化 max.score=-1, min.score=101
// 掃描更新,最後輸出
題意:給定 N 人姓名與生日 (yyyy/mm/dd),過濾非法日期 (早於 1814/09/06 或晚於 2014/09/06),輸出合法人數、最年長者、最年輕者姓名。
關鍵技巧:日期字串直接 strcmp 比較 (格式固定、零補齊),或解析 yyyy,mm,dd 整數比較。
// 字串比較法 (最簡潔) char floor[] = "1814/09/06", upper[] = "2014/09/06"; if (strcmp(date, floor) < 0 || strcmp(date, upper) > 0) continue; // 非法 // 更新最早/最晚
題意:N 筆記錄 (學校編號、分數),累加各校總分,輸出最高總分學校編號與總分。學校編號 1~N 連續。
解法:陣列 school[100010] 直接索引累加,最後線性掃描找最大值。
int school[100010] = {0};
for (i=0; i max) { max=school[i]; ans=i; }
題意:3 場比賽,各給 W/T/L 賠率。每場選最高賠率選項,最終獲利 = (∏max_odds * 0.65 - 1) * 2,輸出三選項代碼與獲利 (保留 2 位小數)。
核心:三輪各找最大值與索引,映射 {W,T,L} 輸出。
| 題目 | 核心資料結構 | 關鍵演算法 | 陷阱 |
|---|---|---|---|
| B1004 | 結構體 | 單掃描極值 | 分數唯一無並列 |
| B1028 | 字串/結構體 | 日期範圍過濾+極值 | 日期字串直接比較/解析整數均可 |
| B1032 | 陣列 | 直接定址累加 | 學校編號連續 1~N,陣列大小 N+1 |
| A1011 | 陣列/字元映射 | 三輪找最大 | 浮點數精度、輸出格式 %.2f |
此組題目均屬「單次掃描、直接定址/極值維護」的基礎查找類問題,核心考察:**結構體使用、字串/日期比較、陣列直接定址累加、浮點數格式化輸出**。屬 PAT 入門必刷題組。