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