标签:dp algorithm acm算法 iostream math
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!
#include <stdio.h> #include <cstring> #include <cmath> #include <cstdlib> #include <iostream> #include <algorithm> #include <iostream> #include <queue> #include <stack> #include <map> #include <vector> using namespace std; #define ll long long #define inf 0x7f7f7f7f #define mod 100 /* int fastmi(ll a,ll b) { ll res=1; ll base=a; while(b) { if(b&1) res=(res*base)%mod; base=(base*base)%mod; b>>=1; } return res%mod; } */ int main() { double l,c,t,vr,vt1,vt2; int n,i,j; double dis[105]; //表示第i个加油站到起点的距离 double dp[105]; //保存乌龟到第i个加油站的最短时间。 double lengh; while(cin>>l) { memset(dis,0,sizeof(dis)); cin>>n>>c>>t; cin>>vr>>vt1>>vt2; for(i=1; i<=n; i++) cin>>dis[i]; double rabbit_t=l/vr; //兔子到达的总时间 double wugui_t; //乌龟总时间。 dp[0]=0; //第0个加油站默认在起点,此时是满电。时间为0 dis[n+1]=l; //设终点。距离为l。 for(i=1; i<=n+1; i++) { dp[i]=inf; //此时时间未知,设为无穷大 for(j=0; j<i; j++) //枚举任意加油站到另一个加油站的所有情况。(从第一个加油站往后枚举) { lengh=dis[i]-dis[j]; //枚举任意加油站之间的长度 if(lengh>c) //如果两个加油站之间的距离大于电动车充满电骑车的最大距离C。 wugui_t=c/vt1+(lengh-c)/vt2;//则时间为骑电动车的时间加上剩下的乌龟走路的时间 else wugui_t=lengh/vt1;//否则时间为骑电动车的时间 wugui_t+=dp[j];//再加上前一个加油站的时间 if(j>0) wugui_t+=t; //j为0不加,此时在起点,默认加油时间为0.否则加上加油时间。 dp[i]=min(dp[i],wugui_t);//更新最短的状态。 } } //dp【n+1】则为乌龟的最少时间,保存了乌龟到达终点的时间状态 if(dp[n+1]>rabbit_t) //终点状态的时间大于兔子的时间,乌龟输。 cout<<"Good job,rabbit!"<<endl; else //否则兔子输。 cout<<"What a pity rabbit!"<<endl; } return 0; }
标签:dp algorithm acm算法 iostream math
原文地址:http://blog.csdn.net/sky_miange/article/details/44921931