You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

##AcWing 1123

一、题目描述

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

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

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

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

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

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

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

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

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

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

输出格式为hours:minutesminutes不足两位数时需要补前导零

具体格式参照样例。

数据范围 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分钟。

二、前导知识

欧拉路径

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

欧拉回路

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

类型 存在欧拉路径 存在欧拉回路 总结
无向图 度数为奇数的点只能有02 度数为奇数的点只能有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;
}