Codeforces 暑期特訓:我想成為演算法大師 - Week 2
From LI2 Contests Group
Contest 11. Binary Search
C. Street with monuments
Problem: C. Street with monuments
Solution: GitHub Code
用 upper_bound() 找第一個大於目標
target=d[i]+r 的元素
1 | void solve() { |
* 記得開 long long
E. Diplomas
Problem: E. Diplomas
Solution: GitHub Code
如果答案邊長是 ans ,那麼邊長為 ans+1
也會成立,所以目標是用 binary_search 找到最小的邊長
1 | void solve() { |
J. Forest Clearing
Problem: J. Forest Clearing
Solution: GitHub Code
用 binary_search 找最少能砍完的天數
記得開 long long ,其中
y += a * (mid - mid / k); 及
y += b * (mid - mid / m); 可能會卡在 WA,因為 109 × 1018 = 1027
會溢位。
1 | void solve() { |
Contest 13. Recursion
C. Transformations
Problem: C. Transformations
Solution: GitHub Code
BFS 從 b 每次做 -1 或 /2
的動作推到 a 其中 queue q 是存 BFS
路徑的節點,再用 map prev 、 op
存經過每個數字的下個點及做的動作,最後 now 從
a 跑到 b,再將答案的等式做出來。
1 | void solve() { |
E. Weighing
Problem: E. Weighing
Solution: GitHub Code
每個砝碼 (w[i]) 有三種選擇:
- 放左邊
-w[i] - 放右邊
+w[i] - 不放
+0
m為砝碼總重,如果將所有砝碼都放在同一邊,陣列左右都設成m,重量不會超過- 初始化二維
dp,第一行idx=0什麼都不放,所以在平衝狀態dp[0][m]為true - 對於每行
dp[i][j]為true的狀態,分別考慮當前砝碼做三個動作後的平衡狀態(寫入dp[i+1]列) - 迴圈跑完後,最後看若將重量為
k的砝碼放在右邊,是不是還存在這樣的狀況
1 | void solve() { |
J. Coins
Problem: J. Coins
Solution: GitHub Code
用 dfs 遍歷每個可能
1 | void solve() { |
L. Peaceful Queens
Problem: L. Peaceful Queens
Solution: GitHub Code
- 用 dfs 做下去,每層往上確認能不能放進去,走到底之後再存到
ans的陣列裡 - 用三個一維陣列
visit、diag_pos、diag_neg來存直線跟對角能不能放的狀態
1 | void solve() { |