首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

BestCoder Round #41 解題報告:A 同花順、B 字符串博弈

     編輯:關於C++

A. ZCC loves straight flush

5 張牌,每張有花色 (A/B/C/D) 和點數。可重新排序,求組成「同花順」(同花色連續點數)的最長長度,輸出 5 - maxLen(需換掉的牌數)。

解法:按花色分組,每組點數排序,滑動窗口/枚舉起點找最長連續段(注意 A 可作 1 或 14)。時間 O(1)。

B. ZCC loves strings

N 個字符串,隨機選兩個不同串。雙人遊戲,先手 Miss G。操作:A) 刪除一串末尾字符;B) 兩串相同且非空時清空兩串。無法操作者負。求 Miss G 獲勝概率。

博弈分析:等價於 Nim 堆。兩串長度奇偶性不同 → 先手勝;相同 → 先手負。另:兩串完全相同 → 先手可直接操作 B 清空獲勝。

統計:

  • odd = 奇數長串數,even = 偶數長串數
  • 相同串對數:用 map 計數,每組貢獻 C(cnt,2)
  • 先手勝總對數 = odd * even + 同串對數
  • 總對數 = C(N,2)
  • 約分輸出

代碼片段 (B)


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 紫名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved