AcWing 1123. 铲雪车

\(AcWing\) \(1123\)

一、题目描述

随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。

整个城市所有的道路都是双向车道,道路的两个方向均需要铲雪。因为城市预算的削减,整个城市只有 \(1\) 辆铲雪车。

铲雪车只能把它开过的地方(车道)的雪铲干净,无论哪儿有雪,铲雪车都得从停放的地方出发,游历整个城市 的街道。

现在的问题是:最少要花多少时间去铲掉所有道路上的雪呢

输入格式
输入数据的第 \(1\) 行表示铲雪车的停放坐标 \((x,y)\)\(x,y\) 为整数,单位为米。

下面最多有\(4000\)行,每行给出了一条街道的起点坐标和终点坐标,坐标均为整数,所有街道都是笔直的,且都是 双向车道

铲雪车可以在任意交叉口、或任何街道的末尾任意转向,包括转 \(U\) 型弯。

铲雪车铲雪时前进速度为 \(20\) 千米/时,不铲雪时前进速度为 \(50\) 千米/时。

保证:铲雪车从起点一定可以到达任何街道。

输出格式
输出铲掉所有街道上的雪并且返回出发点的最短时间,精确到分钟,四舍五入到整数。

输出格式为hours:minutes\(minutes\)不足两位数时需要补前导零

具体格式参照样例。

数据范围
\(−10^6≤x,y≤10^6\)
所有位置坐标绝对值不超过 \(10^6\)

输入样例

0 0
0 0 10000 10000
5000 -10000 5000 10000
5000 10000 10000 10000

输出样例

3:55

样例解释
输出结果表示共需\(3\)小时\(55\)分钟。

二、前导知识

欧拉路径

图中所有的边都经过且只经过一次(一笔画)

欧拉回路

起点与终点相同的欧拉路径

类型 存在欧拉路径 存在欧拉回路 总结
无向图 度数为奇数的点只能有\(0\)\(2\) 度数为奇数的点只能有\(0\) 度数是奇数的点有几个
有向图 ① 所有点的出度均等于入度
② 除两个点外,其余点出度等于入度, 此两点:一个出度比入度多\(1\)(起点),另一个入度比出度多\(1\)(终点)
所有点的出度均等于入度 出度与入度是不是相等

三、题目解析

这是个智力题。

这个图很特殊,每个点的入度和出度是一样的。这是一个欧拉图。

所以我们只要把每条路的长度算出来,除以速度就行了。

答案和铲雪车一开始在哪里无关。

注意
\(50km/h\)的速度在本题中没有任何作用,图不需要建出

\(Code\)

#include <bits/stdc++.h>

using namespace std;

int main() {
    double x1, y1, x2, y2;
    cin >> x1 >> y1;
    double sum = 0;
    while (cin >> x1 >> y1 >> x2 >> y2) {
        double dx = x1 - x2;
        double dy = y1 - y2;
        //欧几里得距离
        sum += sqrt(dx * dx + dy * dy) * 2;
        // sum += hypot(dx, dy) * 2;
    }
    // 20千米/小时
    int minutes = round(sum / 1000 / 20 * 60);
    int hours = minutes / 60;
    minutes %= 60;
    printf("%d:%02d\n", hours, minutes);
    return 0;
}
posted @ 2022-04-06 12:59  糖豆爸爸  阅读(109)  评论(0编辑  收藏  举报
Live2D