题目描述:
随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。
整个城市所有的道路都是双向车道,道路的两个方向均需要铲雪。因为城市预算的削减,整个城市只有 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分钟。
题解:
我们将这个图看成有向图,对于每输入一组数据加两条有向边,需要每条边都至少走一遍
我们先回想一下存在有向图的欧拉路径的充分必要条件
- 所有点的入度都等于出度
- 除了两个点以外的点入度等于出度,
这两个点一个 入度 = 出度 + 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;
}
一直有个疑问,这个程序要是在编译器上运行,跳不出while循环该咋办
谢谢分享,这个取整的方法有一点小瑕疵,跑不过这个 测试数据,应该输出1:00但是代码输出0:60
0 0
0 0 0 9999