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

主要原因是仅仅考虑了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[n] = 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值