正经的贪心思路。
认真阅读题目,考虑我们能使用怎样的策略,花最少的钱到达终点:
- 在后面找到了第一个更便宜的加油站,则你一定要在那儿加油——而且要在到那儿之前烧光邮箱里的油。
- 如果后面没有一个加油站比你所处的便宜,加满油,开到能到达的最便宜的加油站。
- 如果加满油也到不了下一个加油站或终点,输出
No Solution
吧。
程序的运行过程是:从起点找到下一步要到的加油站 \(x\),从 \(x\) 找下一步要到的加油站 \(y\),以此类推。
代码应当注意细节。下面贴出“向后找”部分的代码:
static int solve(int now) {
double oneGo = capacity * unitDis;
int minPriceStation = n + 1;
for (int i = now + 1; i <= n && dis[i] - dis[now] <= oneGo; ++i) {
if (price[i] < price[now]) {
ans += ((dis[i] - dis[now] - restFuelToGo) / unitDis) * price[now];
restFuelToGo = 0;
return i;
}
if (minPriceStation == n + 1 || price[i] < price[minPriceStation]) minPriceStation = i;
}
if (distance - dis[now] <= oneGo) {
ans += ((distance - dis[now] - restFuelToGo) / unitDis) * price[now];
return n + 1;
}
if (minPriceStation == n + 1) {
System.out.println("No Solution");
return -1;
}
ans += capacity * price[now];
restFuelToGo += oneGo - (dis[minPriceStation] - dis[now]);
return minPriceStation;
}