早上蓝桥杯就有这题,做了两小时没做出来,结果一共才做了五题,哭瞎了,又被虐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");
}
}