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

勞動節編程練習:Codeforces 多題解題報告與算法心得

     編輯:關於C

前言

勞動節期間刷 Codeforces 多道題目,記錄解題思路、踩坑經驗與代碼優化過程。

題目 A:987654321 Problem

打表找規律,屬於水題。

題目 B:Self-numbers 2

初版:哈希表 → 內存超限/超時

將不符合條件的數存入哈希表,第 5 組 PE,第 6 組 TLE。

優化:滾動數組(滑動窗口)

  • 最大影響範圍:7 位數 × 9 = 63
  • 開長度 126 數組,以 63 為滾動節點
  • f1 記錄當前波影響,f2 記錄對下一波影響
  • 空間 O(1),時間 O(N)

題目 C:Boxes

模擬法通過

  • 數據最大 2^31,最差 31×31=961 步
  • 每次移動雙方接近,實測 50 步內結束
  • 代碼簡潔,無需 O(1) 數學解

題目 D:Palindrome pairs

  • 統計回文子串頭尾位置
  • 字符長度為 1 的情況處理困難,暫未完全解決
  • Manacher 算法可優化

題目 E:模擬大法

  • 找最近有效段落,然後按規則模擬輸出
  • 邏輯直觀,注意邊界條件

題目 F:排序 + 模擬

  • 按坐標排序後依次處理
  • 輸出格式嚴格,注意 PE 風險

題目 G:模擬 + 畫圖

  • 記錄路徑轉折點
  • 下界計算易錯,導致 2 次 WA
  • 最終通過,但代碼可進一步優化

題目 H:Wall Painting(異或運算)

核心洞察

  • 異或和可拆解:每位獨立計算
  • 所有組合總和 = 各位貢獻之和
  • 無需容斥原理,直接組合數學計算
  • 組合數 C(n,k) 預處理,模 1000003

題目 I:Railway Tickets(DP)

  • 終點可在起點前(需 swap)
  • 三種票價區間,狀態轉移 O(n×max_len)
  • 交 11 次才 AC,邊界條件極其關鍵

題目 J:Ministry(二維 DP + 滾動數組)

  • 每層只依賴上一層 → 滾動數組優化空間
  • 左右掃描兩遍取最小(順序無關)
  • 路徑回溯輸出

題目 K:規律題

  • 1×n: (n+1)/2
  • 2×n: 可轉化為 1×n
  • 3 是關鍵:優先用 1×3 消除
  • 取模 3 後處理殘餘

題目 L:Gentlemen(01 背包變體)

  • DP 計算方案數,pre 數組記錄路徑
  • 方案數 >1 輸出 -1,=0 輸出 0,=1 回溯輸出
  • 比標準 01 背包寫法更直觀

題目 M:Broken Line

  • 題目實為矩形邊界判斷(非任意圖形)
  • 向量法過度複雜,幾何判斷極簡
  • 判斷點在線段上、射線法判斷內外

題目 N:Beat(DFS)

  • 數據極小(n≤20),暴力 DFS 即可
  • 狀態:當前節點、已選邊數、上一邊權重
  • 剪枝:要求邊權非遞減

總結心得

  1. 模擬題佔多數,邏輯清晰比優化重要
  2. 滾動數組是 DP 空間優化利器
  3. 組合數學可化繁為簡(題目 H)
  4. 讀題細節決定生死(題目 I swap、題目 M 矩形)
  5. CF 寬容 PE,但嚴格格式仍需遵守
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved