hdu 2059

时间:2023-03-09 00:56:31
hdu 2059

ps:终于解决了。。。。卡了我好久。最后用了DP。然后还有记忆化搜索优化了一下。终于AC了

思路:要计算dp[n](就是到第n个站的最短时间,也就是最优方案),必须知道dp[0]到dp[n-1]

设j是上一个站的充电,j从0开始循环,找出最优充电站,一直循环到n-1.然后取这里面的最小值.

代码:

#include "stdio.h"
#include "string.h"
int L,N,C,T,VR,VT1,VT2;
int p[];
double dd[];
double dp(int n){
int i;
if(n==) return 0.0;
if(dd[n]>0.0) return dd[n];
int len;
double time,min;
min=100000000.0;
for(i=;i<n;i++){
len=p[n]-p[i];
if(len>=C){
time=(double)(len-C)/VT2+(double)C/VT1;
}
else{
time=(double)len/VT1;
}
if(i) time+=T;
if(dp(i)+time<min){
min=dp(i)+time;
}
}
return dd[i]=min;
}
int main(){
int i;
double time2;
while(~scanf("%d",&L)){
scanf("%d%d%d",&N,&C,&T);
scanf("%d%d%d",&VR,&VT1,&VT2);
memset(dd,-,sizeof(dd));
for(i=;i<=N;i++){
scanf("%d",&p[i]);
}
p[]=;
p[N+]=L;
time2=(double )L/VR;
if(dp(N+)>time2*1.0) printf("Good job,rabbit!\n");
else printf("What a pity rabbit!\n");
}
return ;
}