P9749
P9749 公路
话说本次 CSP J 和 S 出的 T2 都是原题的极其弱化版。
思路
就是一个特别板的贪心。每到一个站,就选择之前的最便宜的那一个站加就可以了,只用确保到下一个站。
不用 dfs,也不用分支语句(min 函数除外),也不用多余的数组,只用递推即可。具体的加油量使用类似高精除的方法即可,不需要浮点数。
极简代码
// O(n)
#include <iostream>
using namespace std;
#define MAXN 100005
using ll = long long;
ll v[MAXN];
ll d;
int n;
int main()
{
cin >> n >> d;
for (int i = 1; i < n; i++)
{
cin >> v[i];
}
ll r = 0, mn = 0x3ffff3fff3fff3ff; // 余数,最便油价
ll res = 0;
for (int i = 1; i < n; i++)
{
ll a;
cin >> a;
mn = min(mn, a);
int b = ((v[i] - r) + d - 1) / d;
res += b * mn;
r = b * d + r - v[i];
}
cout << res << endl;
return 0;
}