铲雪车(C++)

题目描述

       随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。整个城市所有的道路都是双车道,因为城市预算的削减,整个城市只有1辆铲雪车。铲雪车只能把它开过的地方(车道)的雪铲干净,无论哪儿有雪,铲雪车都得从停放的地方出发,游历整个城市的街道。现在的问题是:最少要花多少时间去铲掉所有道路上的雪呢?

输入格式

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

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

输出格式

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

样例输入1
0 0
0 0 10000 10000
5000 -10000 5000 10000
5000 10000 10000 10000
样例输出1
3:55
#include<bits/stdc++.h>
using namespace std;
int x, y;
double t, m, h;
long long a, b, c, d;
double yjc = 0;

int main() {
	cin >> x >> y;

	while (cin >> a >> b >> c >> d) {
		yjc += 2 * sqrt((a - c) * (a - c) + (b - d) * (b - d));
	}
	t = yjc / 1000 / 20;
	//cout<<t<<endl;
	h = floor(t);
	//cout<<h<<endl;
	m = round((t - h) * 60);
	cout << h << ':' << setw(2) << setfill('0') << m;
	return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Dijkstra算法求解的C++代码示例: ```cpp #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> using namespace std; const int MAXN = 205; const double INF = 1e9; struct Point { double x, y; }; struct Edge { int from, to; double dist; }; struct HeapNode { int u; double d; bool operator < (const HeapNode& rhs) const { return d > rhs.d; } }; int n, m; Point p[MAXN]; Edge e[MAXN * MAXN]; int first[MAXN], next[MAXN * MAXN]; double dist[MAXN][MAXN]; bool vis[MAXN]; void addEdge(int u, int v, double w) { static int cnt = 0; e[cnt].from = u; e[cnt].to = v; e[cnt].dist = w; next[cnt] = first[u]; first[u] = cnt++; } void Dijkstra(int s) { priority_queue<HeapNode> pq; memset(vis, false, sizeof(vis)); for (int i = 0; i < n; i++) { dist[s][i] = (i == s ? 0 : INF); } pq.push((HeapNode){s, 0}); while (!pq.empty()) { int u = pq.top().u; pq.pop(); if (vis[u]) continue; vis[u] = true; for (int i = first[u]; i != -1; i = next[i]) { int v = e[i].to; double w = e[i].dist; if (dist[s][v] > dist[s][u] + w) { dist[s][v] = dist[s][u] + w; if (!vis[v]) pq.push((HeapNode){v, dist[s][v]}); } } } } int main() { memset(first, -1, sizeof(first)); scanf("%lf%lf", &p[0].x, &p[0].y); n = 1; while (scanf("%lf%lf%lf%lf", &p[n].x, &p[n].y, &p[n + 1].x, &p[n + 1].y) == 4) { double d = sqrt(pow(p[n].x - p[n + 1].x, 2) + pow(p[n].y - p[n + 1].y, 2)); addEdge(n, n + 1, d / 50); addEdge(n + 1, n, d / 50); n += 2; } m = n; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double d = sqrt(pow(p[i].x - p[j].x, 2) + pow(p[i].y - p[j].y, 2)); if (i % 2 == 0 && j % 2 == 0) { addEdge(i, j + 1, d / 20); addEdge(j, i + 1, d / 20); } else if (i % 2 == 0 && j % 2 == 1) { addEdge(i, j, d / 50); addEdge(j + 1, i + 1, d / 50); } else if (i % 2 == 1 && j % 2 == 0) { addEdge(i + 1, j + 1, d / 50); addEdge(j, i, d / 50); } else { addEdge(i + 1, j, d / 20); addEdge(j + 1, i, d / 20); } } } for (int i = 0; i < n; i++) { Dijkstra(i); } double ans = INF; for (int i = 0; i < n; i++) { double dist1 = 0; for (int j = 0; j < n; j++) { dist1 = max(dist1, dist[i][j]); } ans = min(ans, dist1); } int h = (int)floor(ans); int m = (int)floor((ans - h) * 60); printf("%d:%02d\n", h, m); return 0; } ``` 注:该代码在洛谷上能够通过本题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值