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

Codeforces Round #Pi (Div. 2) A/B/C/D 四題完整解析

     編輯:關於C++

A. Lineland Mail

問題:n 個城市位於數軸上,坐標遞增。對每個城市,求到其他城市的最小和最大距離。

解法:城市已排序。第 i 個城市:
最小距離 = min(x[i] - x[i-1], x[i+1] - x[i])(邊界特判)
最大距離 = max(x[i] - x[0], x[n-1] - x[i])

時間 O(n),單次掃描即可。

B. Berland National Library

問題:給定進出記錄(+id 進入,-id 離開),初始和最終可能有人在館內。求最小可能容量。

解法:用集合模擬當前在館內的人。遇到 -id 但 id 不在集合中,說明此人初始就在館內,容量下限 +1。答案為過程中集合大小與初始人數之和的最大值。

set st; int ans = 0;
for each event:
    if '+': st.insert(id);
    else: if (!st.count(id)) ++ans; else st.erase(id);
    ans = max(ans, (int)st.size());

C. Geometric Progression

問題:給定序列 a 和公比 k,求嚴格遞增下標三元組 (i, j, k) 使 a[j] = a[i]·k, a[k] = a[j]·k。

解法:遍歷序列,維護兩個哈希表:
first[x] = 值為 x 作為首項的出現次數
second[x] = 值為 x 作為第二項的合法三元組前綴數
對當前值 v:若 v % k == 0,答案增加 second[v/k];更新 second[v] += first[v/k];first[v]++。
特判 k = 1 時避免重複計數。時間 O(n)。

D. One-Dimensional Battle Ships

問題:長度 n 線段放 k 艘長度 a 的船(不相鄰)。給定 m 次射擊位置,求最早第幾次射擊必定擊中船。

解法:用有序集合維護已射擊位置(含邊界 0 和 n+1)。初始最大可放船數 = ⌊n/(a+1)⌋(首尾特判)。每次插入射擊點 x,找其左右相鄰已射擊點 l, r,更新可放船數:
減去原區間貢獻 (r-l)/(a+1),加上左右新區間貢獻。若可放船數 < k,輸出當前步數。
時間 O(m log m)。

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