4 条题解

  • 0
    @ 2025-5-31 14:48:15

    #include <iostream> #include <vector> #include <algorithm> #include <climits>

    using namespace std;

    int main() { int n; cin >> n;

    vector<pair<int, int>> dominoes(n);
    int top_sum = 0, bottom_sum = 0;
    
    for (int i = 0; i < n; ++i) {
        cin >> dominoes[i].first >> dominoes[i].second;
        top_sum += dominoes[i].first;
        bottom_sum += dominoes[i].second;
    }
    
    int min_diff = abs(top_sum - bottom_sum);
    int min_flips = 0;
    
    vector<vector<int>> dp(n + 1, vector<int>(2 * 6 * n + 1, INT_MAX));
    dp[0][6 * n] = 0;  // 初始状态,差值为0,翻转次数为0
    
    for (int i = 0; i < n; ++i) {
        int a = dominoes[i].first;
        int b = dominoes[i].second;
        int diff = a - b;
      
        for (int j = 0; j <= 2 * 6 * n; ++j) {
            if (dp[i][j] != INT_MAX) {
                // 不翻转当前骨牌
                int new_j = j + diff;
                if (new_j >= 0 && new_j <= 2 * 6 * n) {
                    if (dp[i + 1][new_j] > dp[i][j]) {
                        dp[i + 1][new_j] = dp[i][j];
                    }
                }
              
                // 翻转当前骨牌
                new_j = j - diff;
                if (new_j >= 0 && new_j <= 2 * 6 * n) {
                    if (dp[i + 1][new_j] > dp[i][j] + 1) {
                        dp[i + 1][new_j] = dp[i][j] + 1;
                    }
                }
            }
        }
    }
    
    for (int j = 0; j <= 2 * 6 * n; ++j) {
        if (dp[n][j] != INT_MAX) {
            int current_diff = abs(j - 6 * n);
            if (current_diff < min_diff) {
                min_diff = current_diff;
                min_flips = dp[n][j];
            } else if (current_diff == min_diff && dp[n][j] < min_flips) {
                min_flips = dp[n][j];
            }
        }
    }
    
    cout << min_flips << endl;
    return 0;
    

    }

    信息

    ID
    135
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    71
    已通过
    10
    上传者