提交时间:2026-06-17 07:03:03
运行 ID: 91834
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <climits> using namespace std; struct Point { int x, y; }; int main() { int n, m, k; cin >> n >> m >> k; vector<Point> vill(n); for (int i = 0; i < n; ++i) { cin >> vill[i].x >> vill[i].y; } vector<Point> post(m); for (int i = 0; i < m; ++i) { cin >> post[i].x >> post[i].y; } // 预处理:每个村民到每个邮局的距离 vector<vector<double>> dist(n, vector<double>(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { int dx = vill[i].x - post[j].x; int dy = vill[i].y - post[j].y; dist[i][j] = sqrt(dx*dx + dy*dy); } } double min_sum = 1e18; vector<int> best; // 枚举所有子集 for (int mask = 0; mask < (1 << m); ++mask) { int cnt = __builtin_popcount(mask); if (cnt != k) continue; // 计算当前方案总距离 double sum = 0; for (int i = 0; i < n; ++i) { double d = 1e18; for (int j = 0; j < m; ++j) { if (mask & (1 << j)) { d = min(d, dist[i][j]); } } sum += d; } // 更新最优解 if (sum < min_sum) { min_sum = sum; best.clear(); for (int j = 0; j < m; ++j) { if (mask & (1 << j)) { best.push_back(j + 1); // 编号从1开始 } } } } sort(best.begin(), best.end()); for (int i = 0; i < best.size(); ++i) { if (i > 0) cout << " "; cout << best[i]; } cout << endl; return 0; }