经典而不失思维含量的贪心题:你要花多少钱、怎样给车加油以到达终点?

正经的贪心思路。

认真阅读题目,考虑我们能使用怎样的策略,花最少的钱到达终点:

  • 在后面找到了第一个更便宜的加油站,则你一定要在那儿加油——而且要在到那儿之前烧光邮箱里的油
  • 如果后面没有一个加油站比你所处的便宜,加满油,开到能到达的最便宜的加油站。
  • 如果加满油也到不了下一个加油站或终点,输出 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;
    }

THE END