题意:
只有一组数据,第一行给的是家的坐标和学校的坐标,接着后面的都是地铁线路上各个站的坐标,以(-1,-1)结束。已知步行速度为10km/h,地铁速度为40km/h,求家里到学校的最短时间(分钟,四舍五入到整数)。
注意:
- 给的坐标单位是米,给的速度的单位是km/h,要求的结果是分钟。
- 注意在求地铁从1号站到3号站所花费的时间,是从1号站到2号站的距离除以速度,再加上从2号站到3号站的距离除以速度。而不是直接求从1号站到3号站的距离除以速度。(之前就是因为这个WA了几次(-.-!!) )
#include <cstdio> #include <math.h> #include <algorithm> using namespace std; const int N = 1000, INF = 0x3f3f3f3f; struct POINT { int x; int y; }vertex[N]; double time[N][N] = {0}; bool cnt[N] = {0}; void qwe(int& n) { int x, y, start, end; while(1) { start = n; for(; ; ++n) { if(!~scanf("%d %d", &x, &y)) return ; if(x == -1 && y == -1) { end = n; break; } else { vertex[n].x = x; vertex[n].y = y; } } for(int i=start+1; i<end; ++i) { double dx = (vertex[i].x - vertex[i-1].x) / 1000.0; double dy = (vertex[i].y - vertex[i-1].y) / 1000.0; time[i][i-1] = sqrt(dx*dx + dy*dy) * 1.5; time[i-1][i] = time[i][i-1]; } } } int main(void) { scanf("%d %d %d %d", &vertex[0].x, &vertex[0].y, &vertex[1].x, &vertex[1].y); int n = 2, mintag; qwe(n); for(int i=0; i<n; ++i) { time[i][i] = INF; for(int j=0; j<n; ++j) { if(time[i][j] == 0) { double dx = (vertex[i].x - vertex[j].x) / 1000.0; double dy = (vertex[i].y - vertex[j].y) / 1000.0; time[i][j] = sqrt(dx*dx + dy*dy) * 6; time[j][i] = time[i][j]; } } } cnt[0] = true; for(int i=1; i<n; ++i) { mintag = 0; for(int j=1; j<n; ++j) if(!cnt[j] && time[0][j] < time[0][mintag]) mintag = j; cnt[mintag] = true; for(int j=1; j<n; ++j) if(!cnt[j]) time[0][j] = min(time[0][j], time[0][mintag] + time[mintag][j]); } printf("%.0lf ", time[0][1]); }