提交时间:2025-05-09 16:44:08

运行 ID: 193106

#include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; int main() { ifstream fin("sub.in"); ofstream fout("sub.out"); int N, K; fin >> N >> K; vector<vector<int>> w(N, vector<int>(N)); for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { fin >> w[i][j]; } } int max_sum = 0; for (int red = 1; red < K; ++red) { int blue = K - red; vector<pair<int, int>> red_nodes; vector<pair<int, int>> blue_nodes; for (int i = 0; i < N; ++i) { int sum_red = 0; int sum_blue = 0; for (int j = 0; j < N; ++j) { if (i != j) { sum_red += w[i][j]; sum_blue += w[i][j]; } } red_nodes.emplace_back(-sum_red, i); blue_nodes.emplace_back(-sum_blue, i); } sort(red_nodes.begin(), red_nodes.end()); sort(blue_nodes.begin(), blue_nodes.end()); int current_sum = 0; vector<bool> selected(N, false); for (int i = 0; i < red; ++i) { int node = red_nodes[i].second; selected[node] = true; } for (int i = 0; i < blue; ++i) { int node = blue_nodes[i].second; selected[node] = true; } for (int i = 0; i < N; ++i) { for (int j = i + 1; j < N; ++j) { if (selected[i] && selected[j]) { current_sum += w[i][j]; } } } if (current_sum > max_sum) { max_sum = current_sum; } } fout << max_sum << endl; return 0; }