hdu 2059 龟兔赛跑

题意:龟兔赛跑,乌龟使用一个电动车,一条路上在不同距离处有一个充电站,每次充电需要消耗一定时间,并且他只能维持固定的距离,对于每个充电站,乌龟可以选择充或不充,求最优解。

思路:开始想简单,只定义dp[i] 前i个充电站的最优解,然后第i个充电站,可以选择充或不充,发现这个转移的方程式在这题错误的,因为dp[i]的最优解不仅由dp[i-1]决定充或不充,和前面所有都有关,同时你不知道上一个使用的充电站在哪,距离你当前选择的充电站的距离是多少,时间也不好表。

看了别人题解,正确这里定义dp[i] 为以第i个车站作为最后可选充电站并且到达终点的最优解。然后对于当前i选择选择从前i-1个里面选择哪一个作为上个充电站,并讨论选或不选这个车站对转移到当前终点的最优解。

#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <ctime>
#include <assert.h>

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define eps 1e-8
#define M_PI 3.141592653589793

typedef long long ll;
const ll mod=1000000007;
const double inf=99999999.0;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
double min(double a,double b)
{
    return a<b? a:b;
}
using namespace std;
int v[3],p[110];
double dp[110];
int main()
{
    int n;
    double L,l,t,minn;
    while(cin>>L){
        cin>>n>>l>>t;
        cin>>v[0]>>v[1]>>v[2];
        p[0]=0;
        for(int i=1;i<=n;i++) cin>>p[i];
        p[n+1]=L;
        dp[0]=0.0;
        for(int i=1;i<=n+1;i++){
          double res=inf,minn;
          for(int j=0;j<i;j++){
              double temp=p[i]-p[j];
              if(temp>l) minn=l*1.0/v[1]+(temp-l)/v[2];
              else minn=temp/(v[1]*1.0);
              minn+=dp[j];
              if(j) minn+=t;
              if(res>minn) res=minn;
           }
           dp[i]=res;
        }
        if((L*1.0)/(v[0]*1.0)<dp[n+1]) cout<<"Good job,rabbit!"<<endl;
        else cout<<"What a pity rabbit!"<<endl;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值