早上蓝桥杯就有这题,做了两小时没做出来,结果一共才做了五题,哭瞎了,又被虐QAQ
DP.....DP..........DP我还傻傻的模拟。T T
哥哥竟然被杭电第11页水题虐了!!!
---------------------------------------------------被虐的分割线---------------------------------------------------
传送门 :http://acm.hdu.edu.cn/showproblem.php?pid=2059
中文题不说题意
将起点和终点也当做发电站,这样就避免了两种情况的讨论
设dp[i]为设dp[i]为到达第i个发电站的最小时间,初始的时候为0,
dp[i]=min(dp[j] + t(i,j)) t(i,j)为从j充满电直接到i的时间。
#include<cstdio> #include<algorithm> using namespace std; const int MAXN=101; const int INF=999999; int main() { double L; int N; double C,T; double vr,vt1,vt2; while(~scanf("%lf",&L)) { double dis[MAXN]; scanf("%d",&N); scanf("%lf%lf",&C,&T); scanf("%lf%lf%lf",&vr,&vt1,&vt2); for(int i=1;i<=N;i++) scanf("%lf",&dis[i]); dis[0]=0;//起点存入 dis[++N]=L; //终点存入 double dp[MAXN]={0}; //设dp[i]为到达第i个发电站的最小时间,初始的时候为0 //dp[i]=min(dp[j] + t(i,j)) t(i,j)为从j充满电到i的时间 for(int i=1;i<=N;i++) { dp[i]=INF; //每个点一开始设为无穷大~ for(int j=0;j<i;j++) { double time=0; double len=dis[i]-dis[j]; if( C >= len ) //分情况讨论,C为充满电一次滑行的距离 time=dp[j]+len/vt1; else time=dp[j]+ C/vt1+(len-C)/vt2; if(j!=0) //一开始就充满电不需要时间 time+=T; dp[i]=min(dp[i],time); //每次取最小 } } double tr=L / vr; //兔子的时间 if(tr <dp[N]) printf("Good job,rabbit!\n"); else printf("What a pity rabbit!\n"); } }