我的龟兔赛跑终于A掉了。
之前一直是最优子问题找错了, 一直不理解然后各种WA。
看了别人AC的代码, 思想 想了很久, 才发现问题。
这个记忆挺深刻。必须牢牢记住。继续加油。
#include <iostream> #include <algorithm> #define INF 10000000 using namespace std; int main() { int L, n, c, t, i, j, p[105]; int vr, vt1, vt2; double dp[105], tr, tt, mintime, time; while (scanf("%d", &L) != EOF) { scanf("%d %d %d", &n, &c, &t); scanf("%d %d %d", &vr, &vt1, &vt2); memset(p, 0, sizeof(p)); memset(dp, 0, sizeof(dp)); for (i = 1; i <= n; i++) scanf("%d", &p[i]); p[n+1] = L; //兔子花费时间 tr = L * 1.0/ vr; //计算乌龟花费时间 for (i = 1; i <= n + 1; i++) { mintime = INF * 1.0; //找出从起点到第i个充电站的最短时间 //需要考虑之前的所有充电站的可能 //不能只考虑前一个状态的变化情况 //例A->B->C //A充电但B不充电 time(A-C) //A充电, B也充电 time(A-B-C) //可能time(A-C) > time(A-B-C) //也可能time(A-C) < time(A-B-C) for (j = 0; j < i; j++) { //计算第j个充电站充电一直到终点的时间 + dp[j] time = (p[i]-p[j]) >= c ? c * 1.0 / vt1 + (p[i]-p[j]-c) * 1.0 / vt2 : (p[i]-p[j]) * 1.0 / vt1; if(j != 0) time += t; mintime = min(mintime, time + dp[j]); } dp[i] = mintime; } //乌龟花费时间 tt = dp[n+1]; if (tr < tt) printf("Good job,rabbit!\n"); else printf("What a pity rabbit!\n"); } return 0; }
//最优子问题找的不对!! //感觉这个写成贪心了, 还没学贪心。有空学学 //错误问题还挺严重 是吧。 //residual = p[1] - p[0]; //for (i = 1; i <= n + 1; i++) //{ // charge = notcharge = 0; // //充电 // temp = residual; // if (i != 1) // charge = t; // if (c <= p[i] - p[i-1]) // { // charge += c * 1.0 / vt1 + (p[i] - p[i-1] - c) * 1.0 / vt2; // residual = 0; // } // else // { // charge += (p[i] - p[i-1]) * 1.0 / vt1; // residual = c - (p[i] - p[i-1]); // } // t1 = residual; // //不充电 // residual = temp; // if (residual < p[i] - p[i-1]) // { // notcharge = residual * 1.0 / vt1 + (p[i] - p[i-1] - residual) * 1.0 / vt2; // residual = 0; // } // else // { // notcharge = (p[i] - p[i-1]) * 1.0 / vt1; // residual -= p[i] - p[i-1]; // } // t2 = residual; // //更新状态 // dp[i] = dp[i-1] + min(charge, notcharge); // residual = charge <= notcharge ? t1 : t2; // //printf("i = %4d charge = %4lf notcharge = %4lf\n", i, charge, notcharge); //}