题意:路程L,兔子速度VR,乌龟开车速度VT1,踩车速度VT2,给出每个充电站与原点的距离pi,每次充电时间都为T,问乌龟可能不可能赢兔子。
Analyse:
p1到pn为可充电地点(p0为原点)。假设最优方案中最后一个充电的地点是pn-2,则对于p0至pn-2这段路的充电地点的选择是独立于pn-2至pn之外的,最优方案中,p0到pn-2内的充电点都要选对p0至pn-2最优的地点,因此设time[k]为到达pk点的最快时间,记之前充电的地方为p[lastchar],记p[lastchar](包括p[lastchar],因为可能不充电)到p[k]之间的最优充电点为p[j],则p0到pn的最快时间为time[j]加上p[j]到p[k]最快的时间。k由零开始递增到n,即可求出time[n]。lastchar初始化为0,因为0点一定充了电。
View Code
1 #include<stdio.h>
2 main()
3 {
4 int p[102];
5 int i,j;
6 int mark,lastchar; //mark the last charging location
7 int v1,v2,vr;
8 int l,c,len; //len measures the distance between two points
9 int n,t;
10 double time[101];
11 double temp,min;
12 while(scanf("%d",&l)!=EOF)
13 {
14 scanf("%d%d%d",&n,&c,&t);
15 scanf("%d%d%d",&vr,&v1,&v2);
16 p[0]=0;
17 p[n+1]=l;
18 for(i=1;i<=n;i++)
19 scanf("%d",&p[i]);
20 lastchar=0;
21 time[0]=0;
22 for(i=1;i<=n+1;i++)
23 {
24 min=-1;
25 for(j=lastchar;j<i;j++)
26 {
27 len=p[i]-p[j];
28 temp=len>c?1.0*c/v1+(len-c+0.0)/v2:1.0*len/v1;
29 temp+=time[j];
30 if(j)
31 temp+=t;
32 if(min<0 || min>temp)
33 {
34 min=temp;
35 mark=j;
36 }
37 }
38 lastchar=mark;
39 time[i]=min;
40 }
41 puts(1.0*l/vr>time[n+1]?"What a pity rabbit!":"Good job,rabbit!");
42 }
43 }