2354: 【作】【入门】铲雪车snow

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:4 解决:3

题目描述

随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。整个城市所有的道路都是双车道,因为城市预算的削减,整个城市只有1辆铲雪车。

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

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

输入

输入数据的第1行表示铲雪车的停放坐标(x,y),x,y为整数,单位为米。下面最多有100行,每行给出了一条街道的起点坐标和终点坐标,所有街道都是笔直的,且都是双向一个车道。铲雪车可以在任意交叉口、或任何街道的末尾任意转向,包括转U型弯。铲雪车铲雪时前进速度为20 km/h,不铲雪时前进速度为50 km/h。

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

输出

铲掉所有街道上的雪并且返回出发点的最短时间,精确到分种。

样例输入 复制

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

样例输出 复制

3:55

提示

铲雪车 题目分析

核心结论:每条道路是双车道,双向各一条车道。铲雪要把两个车道全部清扫,等价于:每条街道必须来回各走一遍。
整张图所有顶点度数都是偶数,存在欧拉回路!铲雪车可以不重复走多余路程,沿着欧拉回路清扫完全部车道,最后回到起点。
✅ 不需要额外空驶(不铲雪的路程为 0!),所有行驶路程都是铲雪,速度固定 20km/h。
只需要:
  1. 算出所有街道总长度 × 2(来回双向车道)
  2. 单位转换:米 → 千米
  3. 时间 = 总距离 ÷ 20 (小时)
  4. 把小数小时,拆成「小时:分钟」,分钟补前导零,如 3:01
注意:第一行停放坐标只做读取,计算完全用不到,因为欧拉回路天然可以回到出发点!

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int sx, sy;
    cin >> sx >> sy; // 起点坐标,读入但不使用

    double total_meter = 0;
    int x1,y1,x2,y2;
    while(cin >> x1 >> y1 >> x2 >> y2)
    {
        // 两点距离,单位米
        double dx = x1 - x2;
        double dy = y1 - y2;
        double len = sqrt(dx*dx + dy*dy);
        total_meter += len;
    }
    // 双车道,每条街道双向都要铲,总距离 *=2,转为km
    double total_km = total_meter * 2 / 1000.0;
    double hour = total_km / 20.0;

    int h = floor(hour);
    int m = round( (hour - h) * 60 );
    // 防止四舍五入后m=60
    if(m == 60)
    {
        h += 1;
        m = 0;
    }
    // 输出 h:mm,分钟占2位
    printf("%d:%02d\n", h, m);
    return 0;
}