标签:dp algorithm acm算法 iostream math
100 3 20 5 5 8 2 10 40 60 100 3 60 5 5 8 2 10 40 60
Good job,rabbit! What a pity rabbit!
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <vector>
using namespace std;
#define ll long long
#define inf 0x7f7f7f7f
#define mod 100
/*
int fastmi(ll a,ll b)
{
ll res=1;
ll base=a;
while(b)
{
if(b&1)
res=(res*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return res%mod;
}
*/
int main()
{
double l,c,t,vr,vt1,vt2;
int n,i,j;
double dis[105]; //表示第i个加油站到起点的距离
double dp[105]; //保存乌龟到第i个加油站的最短时间。
double lengh;
while(cin>>l)
{
memset(dis,0,sizeof(dis));
cin>>n>>c>>t;
cin>>vr>>vt1>>vt2;
for(i=1; i<=n; i++)
cin>>dis[i];
double rabbit_t=l/vr; //兔子到达的总时间
double wugui_t; //乌龟总时间。
dp[0]=0; //第0个加油站默认在起点,此时是满电。时间为0
dis[n+1]=l; //设终点。距离为l。
for(i=1; i<=n+1; i++)
{
dp[i]=inf; //此时时间未知,设为无穷大
for(j=0; j<i; j++) //枚举任意加油站到另一个加油站的所有情况。(从第一个加油站往后枚举)
{
lengh=dis[i]-dis[j]; //枚举任意加油站之间的长度
if(lengh>c) //如果两个加油站之间的距离大于电动车充满电骑车的最大距离C。
wugui_t=c/vt1+(lengh-c)/vt2;//则时间为骑电动车的时间加上剩下的乌龟走路的时间
else
wugui_t=lengh/vt1;//否则时间为骑电动车的时间
wugui_t+=dp[j];//再加上前一个加油站的时间
if(j>0)
wugui_t+=t; //j为0不加,此时在起点,默认加油时间为0.否则加上加油时间。
dp[i]=min(dp[i],wugui_t);//更新最短的状态。
}
}
//dp【n+1】则为乌龟的最少时间,保存了乌龟到达终点的时间状态
if(dp[n+1]>rabbit_t) //终点状态的时间大于兔子的时间,乌龟输。
cout<<"Good job,rabbit!"<<endl;
else //否则兔子输。
cout<<"What a pity rabbit!"<<endl;
}
return 0;
}
标签:dp algorithm acm算法 iostream math
原文地址:http://blog.csdn.net/sky_miange/article/details/44921931