您的位置:首页 > 其它

HDU 2059 龟兔赛跑 思想基本正确,但是没有独立做出来,以后再自我考察 update

2012-08-31 10:26 337 查看
主要原因是仅仅考虑了dp[i] = f(i-1, i) + dp[i-1].(其中f(i-1,i)表示从第i-1站到第i站的最短时间)其实未必是从前一个加油站到当前加油站,而应该是dp[i] = f(j, i) + dp[j]; (0 < j < i);

以下是AC代码:

#include <stdio.h>
#include <stdlib.h>
int main ()
{
int L;
int N, C, T;
int vr, vt1, vt2;
int p[103];         //记录各站p[i]到起点的距离
double timeT[103];     //记录第i段的最短时间
double timeR;

while ( scanf ("%d",&L) != EOF )
{
scanf ("%d%d%d", &N , &C, &T);
scanf ("%d%d%d", &vr, &vt1, &vt2);

//兔子的时间
timeR = L * 1.0 / vr;

//记录各站p[i]到起点的距离
p[0] = 0;
p[N + 1] = L;
for (int i = 1; i <= N; i ++)
{
scanf ("%d", &p[i]);
}

//找到p[i] 到 p[i + 1]段的最短耗时
timeT[0] = 0;  //递归出口

double len;
double e, min;
for (int i = 1; i <= N + 1; i ++)
{
min = 9999999.9;

for (int j = 0; j < i; j ++)
{
len = p[i] - p[j];

if (len > C)
e = ( 1.0 * C / vt1 ) + (len - C + 0.0) * 1.0 / vt2 ;
else
e = len * 1.0 / vt1  ;

e += timeT[j];
if (j)
e += T;

if ( e < min)
min = e;
}
timeT[i] = min;
}

if (timeT[N + 1] < timeR)
{
printf ("What a pity rabbit!\n");
}
else
printf ("Good job,rabbit!\n");
}

return 0;

}


2013.4.13 update

今天看同学在做这题,就再做一遍,顺利AC。看来功力有所提升。。

#include <iostream>
using namespace std;
int a[105];
//用p【i】表示到第i个充电站的最小时间
double p[105];
int n, c, t;
int vr, vt1, vt2;

double countTime(int dis) {
double t = 0;
if(dis > c)
t = 1.0 *(dis-c) / vt2 + 1.0 * c / vt1;
else
t = 1.0*dis / vt1;
return t;
}
int main() {
int L;
while(cin >> L) {
cin >> n >> c >> t;
cin >> vr >> vt1 >> vt2;
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
if(a[n-1] != L)
{
a
= L;
n++;
}
p[0] = countTime(a[0]);
for(int i = 1; i < n; i++) {
double minValue = countTime(a[i]);
for(int j = 0; j < i; j++) {
double temp = p[j] + t + countTime(a[i]-a[j]);
if(minValue > temp)
minValue = temp;
}
p[i] = minValue;
}
double tr = 1.0 * L / vr;
if(tr > p[n-1])
cout << "What a pity rabbit!" << endl;
else
cout << "Good job,rabbit!" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: