AcWing 1123 铲雪车

AcWing 1123

题目描述:

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

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

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

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

输入格式

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

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

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

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

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

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

输出格式为”hours:minutes”,minutes不足两位数时需要补前导零
具体格式参照样例。

数据范围

1 0 6 10^6 ≤ x,y ≤ 1 0 6 10^6
所有位置坐标绝对值不超过 1 0 6 10^6

输入样例:

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

输出样例:

3:55

样例解释

输出结果表示共需3小时55分钟。

题解:

我们将这个图看成有向图,对于每输入一组数据加两条有向边,需要每条边都至少走一遍
我们先回想一下存在有向图的欧拉路径的充分必要条件

  1. 所有点的入度都等于出度
  2. 除了两个点以外的点入度等于出度,
    这两个点一个 入度 = 出度 + 1,另一个 入度 = 出度 - 1

因此,我们考虑每加一条边,每个点的入度和出度都加1
所以,每个点的入度都一定等于出度,符合上述的第一条
故这个图存在欧拉路径,并且可以选任意点为起点
所以我们只需统计所有的边的长度总和,跟据20km/h 算出时间即可

注意一下

50km/h的速度在本题中没有任何作用
图不需要建出

代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
double get_dis(double x1, double y1, double x2, double y2){ //计算两点之间的距离
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 
}
int main(){
    double x1, x2, y1, y2, sum = 0;
    scanf("%lf%lf", &x1, &y1);
    while(scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2) == 4)
        sum += get_dis(x1, y1, x2, y2);
    sum *= 2;
    sum /= 1000;
    sum /= 20;
    int h = sum;
    sum *= 60;
    int mi = (sum - h * 60 + 0.5);
    printf("%d:", h);
    if(mi >= 10)
        printf("%d", mi);
    else
        printf("0%d", mi);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/linwenqidbk/article/details/103546246
今日推荐