2 条题解
-
0
//100分的代码:
#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
- 难度
- 9
- 标签
- 递交数
- 61
- 已通过
- 3
- 上传者