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

Codeforces Round #221 Div.2 完整題解:A.杠桿平衡 B.債務優化 C.可被7整除 D.最大子矩陣

     編輯:C++ 入門

A. 杠桿平衡

字符串含 ^(支點)、數字(重量)、=(空)。計算支點左側力矩和與右側力矩和,比較大小輸出 left/right/balance。
單次遍歷 O(n),long long 防溢出。

B. 債務優化

n 人,m 條債務關係 a 欠 b c 元。每人淨流入 = 總被欠 - 總欠出。最優結算:所有淨流入為正的人收到錢,總和即為最少總交易額。
O(n+m),貪心證明:抵消後只需正流入者收錢。

C. 可被 7 整除

同 CF 375A,構造法:取出 1,6,8,9 各一個,剩餘降序做前綴,1689 排列補餘數,0 置末尾。

D. 最大子矩陣 2

n 行 m 列 0/1 矩陣,**行可重新排序,列順序固定**。求全 1 子矩陣最大面積。
核心思路:

  1. 預處理 dp[i][j] = 第 i 行第 j 列向左連續 1 的個數
  2. 對每列 j,統計 cnt[j][len] = 有多少行的 dp[i][j] ≥ len
  3. 面積候選 = len * cnt[j][len],取最大值
  4. 複雜度 O(n*m + m²),n,m ≤ 5000 通過

D 題關鍵代碼

for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
        if (a[i][j] == '1') dp[i][j] = dp[i][j-1] + 1;
        else dp[i][j] = 0;
        cnt[j][dp[i][j]]++;
    }
}
for (int j = 1; j <= m; ++j)
    for (int len = m; len >= 1; --len)
        cnt[j][len] += cnt[j][len+1];  // 後綴和:≥len 的行數

int ans = 0;
for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
        ans = max(ans, dp[i][j] * cnt[j][dp[i][j]]);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved