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

来源:互联网 发布:祛斑精华知乎 编辑:程序博客网 时间:2024/04/28 05:09

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


原创粉丝点击