100 3 20 5 5 8 2 10 40 60 100 3 60 5 5 8 2 10 40 60
Good job,rabbit! What a pity rabbit!
DP 动态规划题。
dp[i]代表到达第 i 个充电站的最短时间。
每个阶段的求法可以理解为在之前的某一座充电站(dp[j])充满电之后一次冲到当前站。那么由此可知,应该考虑 i 前的所有情况,所以取 dp[j] + time(j-->i) 的最小值。在加上充电的时间就是 dp[i] 的解,即:
dp[i] = min( dp[j] + time(i , j) ) + t ;
time( i , j ) 表示在第 j 座充电站充满电之后到达第 i 座充电站的时间。则:
double len = double ( p[i] - p[j] ) ; //p[i] 代表第 i 座充电站的据起点的位置 ,l en代表第j座充电站距第i座充电站的距离。
具体代码如下:
1 #include <iostream>
2 using namespace std;
3 double dp[102]; //dp[i]代表到达第i个充电站的最短时间
4 int L;
5 int N,C,T;
6 int VR,VT1,VT2;
7 int p[102];
8 double time(int i,int j)
9 {
10 double len = double(p[i] - p[j]);
11 if(len<=C)
12 return len/VT1;
13 else
14 return double(C)/VT1 + (len-C)/VT2;
15 }
16 int main()
17 {
18 while(cin>>L){
19 cin>>N>>C>>T;
20 cin>>VR>>VT1>>VT2;
21 for(int i=1;i<=N;i++)
22 cin>>p[i];
23 p[0]=0;
24 p[N+1]=L;
25 dp[0] = 0;
26 dp[1] = dp[0] + time(1,0); //到达第一个充电站的时间
27 for(int i=2;i<=N+1;i++){
28 double Min = 999999;
29 for(int j=0;j<i;j++){
30 double t = dp[j]+time(i,j);
31 if(j) t+=T;
32 if(t < Min)
33 Min=t;
34 }
35 dp[i] = Min;
36 //cout<<Min<<endl;
37 }
38 double rt = double(L)/VR;
39 //cout<<dp[N+1]<<‘ ‘<<rt<<endl;
40 if(dp[N+1] < rt)
41 cout<<"What a pity rabbit!"<<endl;
42 else
43 cout<<"Good job,rabbit!"<<endl;
44 }
45 return 0;
46 }
Freecode : www.cnblogs.com/yym2013
原文:http://www.cnblogs.com/yym2013/p/3528942.html