题目链接:HDOJ 2059
题意:略,咳咳,大家都看得懂
题解:很明显兔子跑完全程的时间很容易就出来了,而且题目数据保证不会出现乌龟和兔子同时到达的情况,所以我们只要求出乌龟跑到终点的最短时间,和兔子的时间对比下就好了。
这个全程有n个充电站可以供给乌龟充电,我们可以设有n+2个充电站,第一个在起点,且不需充电的耗时,第二个在终点,对于第i个充电站(1<=i<=n+1)求出乌龟到达该充电站的最优解,就可
最优解求法:
dp[0] = 0;
dp[i] = dp[j] + Min(t1,t2);//t1表示到达j后充电电满然后到达i所需时间,t2表示到达j后步行到i的时间
PS:如果j ==0 ,充电时间为0,求t1的时候要考虑dis<j,i>和C的大小,如果电动车 的行驶距离不够要换步行;
上代码:
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
#define debug 0
#define M(a,b) memset(a,b,sizeof(a))
#define Max(a,b) ((a>b)?a:b)
#define Min(a,b) ((a<b)?a:b)
#define INT 1<<29
#define REP(o) for(int i=1;i<=o;i++)
const int maxn=100+5;
int L,n,vr;
int c;
int t;
int vt1,vt2;
int a[maxn];
float dp[maxn];
void Do(){
a[0] = 0; //起始点看做一个充电站位置
a[n + 1] = L; //第n+1个充电站
int len;
float t1,t2;
dp[0] = 0; //到达起点时间为0....
for(int i = 1;i <= n + 1;i++)
{
for(int j = 0;j < i;j++)
{
t1 = (j == 0)? 0 : t;
len = a[i] - a[j];
if(c <len)
{
t1 += 1.0 * c / vt1 + 1.0 * (len -c) / vt2;
}
else
t1 += 1.0 * len / vt1;
t2 = 1.0 * len / vt2;
dp[i] = Min(dp[i],dp[j] + Min(t1,t2));
}
}
//printf("%f\n",dp[n + 1]);
if(dp[ n + 1]> 1.0 * L/ vr)
{
printf("Good job,rabbit!\n");
}
else{
printf("What a pity rabbit!\n");
}
}
int main()
{
#if debug
freopen("in.txt","r",stdin);
#endif//debug
while(~scanf("%d%d%d%d",&L,&n,&c,&t))
{
scanf("%d%d%d",&vr,&vt1,&vt2);
REP(n)
scanf("%d",&a[i]);
REP(n + 1)
dp[i] = 0x3f3f3f;
Do();
}
return 0;
}