已有 n 張卡片,絕對值 ≤ x。求最少再添加幾張卡片(絕對值 ≤ x)使總和為 0。
答案:ceil(|sum| / x)。
代碼:cout << (abs(sum) + x - 1) / x;
x 輪比賽,n 個已知輪次(Div1+Div2 或單獨 Div2)。求可能的最少/最多 Div2 輪數。
最多:所有未知輪次全是 Div2。
最少:貪心配對 Div1+Div2(相鄰兩輪),剩餘單獨 Div2。
用 vis[] 標記已知輪次,掃描 1..x-1。
輸出長度 n+m 的 01 串,含 n 個 0、m 個 1,無三連續相同字符。
構造策略:優先放多的字符,但避免三連續。
實際規律:若 m > 2*(n+1) 或 n > 2*(m+1) 無解。
構造:分塊輸出 "110" 或 "10" 等模式。
給定羅馬數字字符串(可能含重複字符),求有多少種排列對應的數值能被 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;)。
略(原文未給出完整題面)。
int n, x, sum = 0, a;
cin >> n >> x;
while (n--) { cin >> a; sum += a; }
cout << (abs(sum) + x - 1) / x << endl;
int x, n; cin >> x >> n; vectorvis(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;
string s; int m; cin >> s >> m; int n = s.size(); vectorval(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 題排列去重與模運算結合。