hdu 2059 龟兔赛跑

来源:互联网 发布:c语言中static的用法 编辑:程序博客网 时间:2024/05/16 09:15

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

思路:开始想简单,只定义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.141592653589793typedef 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;    }}



0 0