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

Codeforces Round #235 Div.2 題解:A-E 全題詳解

     編輯:C++ 入門

A. Vanya and Cards

已有 n 張卡片,絕對值 ≤ x。求最少再添加幾張卡片(絕對值 ≤ x)使總和為 0。
答案:ceil(|sum| / x)。
代碼:cout << (abs(sum) + x - 1) / x;

B. Sereja and Contests

x 輪比賽,n 個已知輪次(Div1+Div2 或單獨 Div2)。求可能的最少/最多 Div2 輪數。
最多:所有未知輪次全是 Div2。
最少:貪心配對 Div1+Div2(相鄰兩輪),剩餘單獨 Div2。
用 vis[] 標記已知輪次,掃描 1..x-1。

C. Team

輸出長度 n+m 的 01 串,含 n 個 0、m 個 1,無三連續相同字符。
構造策略:優先放多的字符,但避免三連續。
實際規律:若 m > 2*(n+1) 或 n > 2*(m+1) 無解。
構造:分塊輸出 "110" 或 "10" 等模式。

D. Roman and Numbers

給定羅馬數字字符串(可能含重複字符),求有多少種排列對應的數值能被 m 整除。
狀態壓縮 DP:dp[mask][mod]。
預處理每個位置的值(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)。
轉移:枚舉下一個字符,計算新模值(需處理減法規則如 IV=4)。
去重:同字符在同層只用第一個(if (i>0 && s[i]==s[i-1] && !(mask&(1<<(i-1)))) continue;)。

E. Olympic Games

略(原文未給出完整題面)。


核心代碼片段

A 題

int n, x, sum = 0, a;
cin >> n >> x;
while (n--) { cin >> a; sum += a; }
cout << (abs(sum) + x - 1) / x << endl;

B 題

int x, n; cin >> x >> n;
vector vis(x+1);
while (n--) {
    int t; cin >> t;
    if (t == 1) { int d1, d2; cin >> d1 >> d2; vis[d1]=vis[d2]=true; }
    else { int d; cin >> d; vis[d]=true; }
}
int maxAns = 0, minAns = 0;
for (int i = 1; i < x; i++) if (!vis[i]) maxAns++;
for (int i = 1; i < x; i++) if (!vis[i] && !vis[i-1]) { minAns++; vis[i]=vis[i-1]=true; }
for (int i = 1; i < x; i++) if (!vis[i]) minAns++;
cout << minAns << " " << maxAns << endl;

D 題

string s; int m; cin >> s >> m;
int n = s.size();
vector val(n);
for (int i = 0; i < n; i++) val[i] = roman_val(s[i]);
vector> dp(1<(m));
dp[0][0] = 1;
for (int mask = 0; mask < (1<

總結

本場比賽涵蓋貪心(A,B)、構造(C)、狀態壓縮 DP(D)。關鍵技巧:B 題雙重貪心策略、C 題無三連續構造邊界判斷、D 題排列去重與模運算結合。

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