Sicily 1264. Atomic Car Race[Special judge]

来源:互联网 发布:淘宝差评能追评吗 编辑:程序博客网 时间:2024/05/16 13:06

题目链接 soj.sysu.edu.cn/1264


题目大意

未来赛车比赛,起决定性因素的是换胎的安排。一场比赛中会有几个换胎的地点,每一次换胎虽然会增加换胎时间b,但是不更换轮胎的话,时间一久赛车的速度就会下降,从而增加比赛时间。所以我们要做的就是提供一个选择换胎点的策略。


思路

最容易想到的就是暴力法,将所有可能的策略进行枚举,思路简单,但是带来的问题就是时间上的开销。

从一一枚举的方法中,我们可以尝试使用动规进行优化。对于终点来说,最佳的策略就是从an[0]到a[n-1]的中选择一个换完胎之后跑到终点时时间花费最短的点 j 进行换胎(其中a[0]是起点,相当于整场比赛跑完都没有换胎)。而到达 j 点之前的时间又可以通过从a[0]到a[j - 1]之前的点计算得来。这种迭代的思想就是利用了最优化原理。


代码

#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int maxn = 10010;int n, an[110];double b, r, v, e, f;double dp[110];double dis[10010];double fun(int x){if (x >= r)return (1.0 / (v - e * (x - r)));elsereturn (1.0 / (v - f * (r - x)));}int main(){ios::sync_with_stdio(false);while (cin >> n && n) {an[0] = 0;for (int i = 1; i <= n; i ++)cin >> an[i];cin >> b;cin >> r >> v >> e >> f;dis[0] = 0;for (int i = 1; i <= an[n]; i ++)dis[i] = dis[i-1] + fun(i-1);dp[0] = 0;for (int i = 1; i <= n; i ++) {double minn = 1000000;if (dp[0] + dis[an[i]] < minn) // 因为第0号点是起点,不需要加入换胎时间b,所以单独提出来考虑minn = dp[0] + dis[an[i]];for (int j = 1; j < i; j ++)if (dp[j] + dis[an[i] - an[j]] + b < minn)minn = dp[j] + dis[an[i] - an[j]] + b;dp[i] = minn;}printf("%.4lf\n", dp[n]);}return 0;}


0 0