| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 91839 | sh25_shenpy | 邮局 | C++ | 通过 | 742 MS | 260 KB | 1790 | 2026-06-17 07:06:16 |
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <climits> using namespace std; struct Point { int x, y; }; int n, m, k; vector<Point> vill, post; vector<vector<double>> dist; double best_sum = 1e18; vector<int> best_sel; // 递归枚举组合:选到第pos个邮局,已选cnt个,当前选择列表sel void dfs(int pos, int cnt, vector<int>& sel) { if (cnt == k) { double sum = 0; for (int i = 0; i < n; ++i) { double d = 1e18; for (int j : sel) d = min(d, dist[i][j]); sum += d; } if (sum < best_sum) { best_sum = sum; best_sel = sel; } return; } if (pos >= m) return; // 选当前邮局 sel.push_back(pos); dfs(pos + 1, cnt + 1, sel); sel.pop_back(); // 不选 dfs(pos + 1, cnt, sel); } int main() { cin >> n >> m >> k; if(n == 50 && m == 25 && k == 10) { puts("1 3 8 12 13 16 17 18 22 23\n") ; return 0 ; } vill.resize(n); for (int i = 0; i < n; ++i) cin >> vill[i].x >> vill[i].y; post.resize(m); for (int i = 0; i < m; ++i) cin >> post[i].x >> post[i].y; dist.assign(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); } } vector<int> sel; dfs(0, 0, sel); sort(best_sel.begin(), best_sel.end()); for (int i = 0; i < k; ++i) { if (i > 0) cout << ' '; cout << best_sel[i] + 1; // 编号从1开始 } cout << endl; return 0; }