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。只需要:
- 算出所有街道总长度 × 2(来回双向车道)
- 单位转换:米 → 千米
- 时间 = 总距离 ÷ 20 (小时)
- 把小数小时,拆成「小时:分钟」,分钟补前导零,如
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;
}