規則:C(錘子) > J(剪刀) > B(布) > C。統計甲乙勝平負,並輸出各自獲勝最多的手勢 (並列按字母序)。
核心技巧:將 C/J/B 映射為 0/1/2,利用 (k1+1)%3 == k2 判斷甲勝 (甲手勢擊敗乙手勢)。
int map(char c) { return c=='B'?0 : c=='C'?1 : 2; }
// (k1+1)%3 == k2 → 甲勝
// k1 == k2 → 平
// else → 乙勝
題意:54 張牌初始序 S1~S13, H1~H13, C1~C13, D1~D13, J1~J2。給定洗牌順序陣列 next[i] (位置 i 移至 next[i]),重複 K 次,輸出最終序列。
關鍵:end[next[i]] = start[i] 完成一次洗牌,再 start = end 迭代 K 次。輸出時 id-- 後 suit=id/13, rank=id%13+1。
題意:環形公路 N 個出口,給定相鄰距離,M 次查詢任意兩出口最短距離。
解法:前綴和 dis[i] 存 1→i+1 距離,總長 sum。查詢 l,r (確保 ldirect = dis[r-1]-dis[l-1],答案 min(direct, sum-direct)。
題意:判斷 A+B > C,A,B,C ∈ [-2^63, 2^63],溢位需處理。
溢位判斷:
A>0, B>0, A+B<0 → 結果為真 (實際和 > 2^63-1 ≥ C)。A<0, B<0, A+B>=0 → 結果為假 (實際和 < -2^63 ≤ C)。A+B > C。| 題目 | 運算 | 核心邏輯 | 關鍵細節 |
|---|---|---|---|
| B1010 | 求導 | a[i-1] = a[i]*i; a[i]=0 | 零多項式輸出 "0 0",指數遞降輸出 |
| A1002 | 加法 | coef[exp] += val | 合併同指數,輸出非零項計數 + 指數遞降 |
| A1009 | 乘法 | ans[exp1+exp2] += coef1*coef2 | 雙重迴圈卷積,結果指數上限 2000 |
struct Term { int exp; double coef; } poly[11];
double ans[2001] = {0};
// 讀入第一多項式到 poly[]
// 讀入第二多項式每項 (exp, cof)
// for j=0..n-1: ans[exp + poly[j].exp] += cof * poly[j].coef;
// 輸出 ans[] 非零項
N ≤ 10^5 時 O(N) 或 O(N log N) 才能通過,O(N^2) 必須優化 (如多項式乘法雙重迴圈上限 10*10=100 可接受)。此組題目涵蓋「遊戲規則模擬、陣列置換迭代、環形前綴和、溢位安全加法、多項式代數運算」五大經典模擬類型,是 PAT 甲/乙級模擬題的縮影。掌握「規則→狀態→迭代→輸出」的標準化解題流程,配合精確的格式控制,可高效攻克此類問題。