暑期dp46道(21)HDOJ 2059 龟兔赛跑

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值