http://acm.hdu.edu.cn/showproblem.php?pid=2059
很显然的加血的那种类型的题目,比赛遇过一次。
看上面这个图,就是到达每站的时候,把可能通过其他方式到达该站的时间都算出来,然后取最小值,
View Code
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #define maxn 10000 #define inf ~0U>>1 using namespace std; int dis[maxn]; double dp[maxn]; double min(double a,double b) { return a<b?a:b; } int main() { int l; int n,c,t; int v1,v2,v3; while(cin>>l) { cin>>n>>c>>t; cin>>v1>>v2>>v3; memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++) cin>>dis[i]; dis[n+1]=l; memset(dp,0,sizeof(dp)); for(int i=1;i<=n+1;i++) { double Min=inf; for(int j=0;j<i;j++) { int len=dis[i]-dis[j]; double temp=len>c?1.0*c/v2+1.0*(len-c)/v3:1.0*len/v2; temp+=dp[j]; if(j)temp+=t;//在j站要加血 Min=min(Min,temp); } dp[i]=Min; } if(dp[n+1]<1.0*l/v1) cout<<"What a pity rabbit!"<<endl; else cout<<"Good job,rabbit!"<<endl; } return 0; }