您的位置:首页 > 其它

杭电ACM2059——龟兔赛跑~~DP

2015-09-06 20:33 435 查看
对于DP,还不是很熟。需要加强!!~~

说一下这道题,由于兔子是匀速的,所以兔子到达终点的时间是确定的,唯一不确定的是乌龟的。

将起点,终点,以及中间的N个充电站当作N + 2 个点。需要求解到达N + 2个点的最优解。

起点时间是0.这是必须的,然后往后面DP

到第i个,就让j从0循环到i-1,依次代表从j站充满了电一直开到i站,这样得到到达i站所需要的最短时间。

最后比较到达第n+2站(终点)的时间与兔子所花的时间就可以了。

下面的是AC的代码:

#include <iostream>
#include <cstring>
using namespace std;

int L, N, C, T;
int VR, VT1, VT2;
int p[102];
double dp[105];
void DP()
{
double min, ans;
memset(dp, -1, sizeof(dp));
dp[0] = 0;
for(int i = 1; i < N + 2; i++)
{
min = 10000000000;
for(int j = 0; j < i; j++)
{
int len = p[i] - p[j];    //判断两个点之间的距离
if(len > C)               //距离大于电动车的最大距离,一段距离需要脚踩
{
ans = 1.0 * C / VT1 + (len - C + 0.0) / VT2;
}
else                      //全程骑车。
{
ans = 1.0 * len / VT1;
}
ans += dp[j];             //加上前面的时间
if(j)                     //过充电站,加上充电时间
ans += T;
if(min > ans)             //找最小时间
min = ans;
}
dp[i] = min;
}
}

int main()
{
while(scanf("%d", &L) != EOF)      //输入
{
scanf("%d%d%d", &N, &C, &T);
scanf("%d%d%d", &VR, &VT1, &VT2);
for(int i = 1; i <= N; i++)
scanf("%d", &p[i]);
p[0] = 0; p[N + 1] = L;     //起点距离为0,终点距离为 L
DP();
if(1.0 * L / VR < dp[N + 1])  //判断时间与兔子的时间的大小
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: