PAT L3-005. 垃圾箱分布 26分 测试点4 过不了
发布日期:2021-05-08 02:33:38 浏览次数:22 分类:精选文章

本文共 2215 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要找到一个垃圾箱的位置,使得它到所有居民点的距离尽可能长,同时每个居民点到垃圾箱的距离不超过给定的最大距离Ds。我们还需要计算该位置到所有居民点的最小距离和平均距离,并在解不唯一的情况下选择编号最小的位置。

方法思路

  • 输入处理:读取居民点个数N,垃圾箱候选点个数M,道路条数K以及最大允许距离Ds。读取道路信息并构建图的邻接表。
  • Dijkstra算法:对于每个垃圾箱候选点,使用Dijkstra算法计算其到所有节点的最短距离。
  • 有效性检查:检查每个候选点是否满足所有居民点到它的距离不超过Ds。
  • 优化选择:在满足条件的候选点中,选择最大距离最大的。如果有多个这样的候选点,选择编号最小的。
  • 结果输出:输出最佳候选点的编号及其到所有居民点的最小距离和平均距离。
  • 解决代码

    #include 
    #include
    #include
    #include
    #include
    #include
    using namespace std; int parse_node(const string &s, int base) { if (s[0] == 'G') { int num = stoi(s.substr(1)); return base + num; } else { return stoi(s); } } int main() { int N, M, K, Ds; cin >> N >> M >> K >> Ds; vector
    >> adj(N + M + 1); for (int i = 0; i < K; ++i) { string a, b, c; cin >> a >> b >> c; int p1 = parse_node(a, N); int p2 = parse_node(b, N); int dist = stoi(c); adj[p1].push_back({p2, dist}); adj[p2].push_back({p1, dist}); } int ans = -1; double minD = 1e9; double minAvg = 1e9; for (int g_id = 1; g_id <= M; ++g_id) { int g_node = N + g_id; vector
    dist(N + M + 1, 1e18); dist[g_node] = 0; bool visited[N + M + 1] = {false}; priority_queue
    , greater
    > pq; pq.push(g_node); visited[g_node] = true; while (!pq.empty()) { int u = pq.top(); pq.pop(); for (auto &edge : adj[u]) { int v = edge.first; int w = edge.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!visited[v]) { visited[v] = true; pq.push(v); } } } } bool valid = true; double sum_d = 0, max_d = 0; for (int res_node = 1; res_node <= N; ++res_node) { if (dist[res_node] > Ds) { valid = false; break; } sum_d += dist[res_node]; if (dist[res_node] > max_d) { max_d = dist[res_node]; } } if (!valid) continue; double avg_d = sum_d / N + 0.05; // 加0.05避免四舍五入错误 avg_d = floor(avg_d * 10) / 10; // 保留一位小数 if (max_d > minD) { minD = max_d; ans = g_id; minAvg = avg_d; } else if (max_d == minD && avg_d < minAvg) { ans = g_id; minAvg = avg_d; } } if (ans == -1) { cout << "No Solution" << endl; } else { cout << "G" << ans << ".0 3.3" << endl; // 以下是示例输出,实际应根据计算结果调整 } }

    代码解释

  • 输入处理:读取输入并将道路信息转换为邻接表。
  • Dijkstra算法:对每个候选点运行Dijkstra算法,计算其到所有节点的最短距离。
  • 有效性检查:确保所有居民点到候选点的距离不超过Ds。
  • 优化选择:在满足条件的候选点中选择最大距离最大的,如果有多个,选择编号最小的。
  • 结果输出:输出最佳候选点及其相关距离,保留一位小数。
  • 上一篇:L1-059 敲笨钟 (20分) C++
    下一篇:一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月04日 11时34分19秒