5 張牌,每張有花色 (A/B/C/D) 和點數。可重新排序,求組成「同花順」(同花色連續點數)的最長長度,輸出 5 - maxLen(需換掉的牌數)。
解法:按花色分組,每組點數排序,滑動窗口/枚舉起點找最長連續段(注意 A 可作 1 或 14)。時間 O(1)。
N 個字符串,隨機選兩個不同串。雙人遊戲,先手 Miss G。操作:A) 刪除一串末尾字符;B) 兩串相同且非空時清空兩串。無法操作者負。求 Miss G 獲勝概率。
博弈分析:等價於 Nim 堆。兩串長度奇偶性不同 → 先手勝;相同 → 先手負。另:兩串完全相同 → 先手可直接操作 B 清空獲勝。
統計:
odd = 奇數長串數,even = 偶數長串數map 計數,每組貢獻 C(cnt,2)odd * even + 同串對數C(N,2)
map mp;
LL odd=0, even=0, samePairs=0;
for (each string s) {
if (mp.count(s)) samePairs += mp[s], mp[s]++;
else mp[s]=1;
(s.length()%2 ? odd : even)++;
}
LL win = odd * even + samePairs;
LL total = (LL)n * (n-1) / 2;
LL g = gcd(win, total);
printf("%lld/%lld\n", win/g, total/g);
前期調試 A 題花費較久(未看清「可重排」),後期 hack 階段激動,最終達成 BC 紫名。