杭电2059
此题是我转载的,开始我也不太懂怎么弄,后来才理解!!如果你现在也是不太懂,让我们一起ac它吧!
这道题的思路大致如下:
假设乌龟修了n个充电站,那么如果把起点和终点也算一个充电站的话一共有n+2个充电站,这样第一个
充电站充电的时间是0,接着进行两个循环,其中for(i=1;i<n+2;i++)是从第一个充电站开始循环,
对于每个i,对于循环for (j=0;j<i;j++)依次算出i其前面的每个充电站是否充电的时间!最后把最短的
时间付给min即可求出乌龟的最佳方案!!
#include<iostream>
using namespace std;
int main()
{
int i,j,p[102];
int l,n,c,t;
int vr,v1,v2;
int len;
double dp[102],min,e;
while(scanf("%d",&l)!=EOF)
{
scanf("%d%d%d",&n,&c,&t);
scanf("%d%d%d",&vr,&v1,&v2);
dp[0]=p[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",p+i);
}
p[i]=l;
for(i=1;i<n+2;i++)
{
min = 0xffffff;
for (j=0;j<i;j++)
{
len=p[i]-p[j];
e=len>c?1.0*c/v1+(len-c+0.0)/v2:1.0*len/v1;
e+= dp[j];
if(j)
{
e += t;
}
if (min>e)
{
min=e;
}
}
dp[i]=min;
}
puts(1.0*l/vr>dp[n+1]?"What a pity rabbit!":"Good job,rabbit!");
}
return 0;
}