思路:sum[i] = min(sum[i],sum[j]+time); time代表从第 j 个节点到第 i 个节点所需要的时间。角度的切入点可以这样:要到达第i个节点,肯定在到达的过程中有加速的过程。我们取最后一次加速点为j,则从 j 到 i 的时间就可以计算了。这样也得对 j 进行枚举,所以是双层循环。 如果这样想:sum[i] = sum[i-1]+min(time)。而由于到达i-1时的速度可能是加速状态,也有可能是慢速状态,十分不确定,无法计算。所以需要引入一个j变量,改变思路。
#include <stdio.h> #include <iostream> #include <queue> #include <algorithm> #include <string> #include <string.h> #include <stdlib.h> #include <cmath> #include <stdint.h> #define INF 100000 using namespace std; int main() { int L, N, C, T, VR, VT1, VT2; while(scanf("%d",&L)!=EOF) { int p[1000]; p[0] = 0; scanf("%d %d %d",&N, &C, &T); scanf("%d %d %d",&VR,&VT1,&VT2); for ( int i = 1; i<N+1; i++ ) scanf("%d",&p[i]); p[N+1] = L; float sum[1000]; sum[0] = 0; for ( int i = 1; i<=N+1;i++) { sum[i] = INF; float time; for ( int j = 0; j <i; j++) { int distance = p[i] - p[j]; if ( distance > C ) time = 1.0*C/VT1+(distance-C)*1.0/VT2; else time = 1.0 * distance / VT1; if(j!=0)time += T; sum[i] = min(sum[i],sum[j]+time); } } if(sum[N+1]*VR<L) printf("What a pity rabbit!\n"); else printf("Good job,rabbit!\n"); } }