53 lines
1.4 KiB
C++
53 lines
1.4 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
#define int long long
|
||
const int N = 100010;
|
||
|
||
int v[N]; // 站点间的距离
|
||
int a[N]; // 每个站点的油价
|
||
int n; // n个站点
|
||
double d; // 1升油可以跑多少公里
|
||
int money; // 一共花费
|
||
int r; // 油箱的油可以跑的公里数
|
||
/*
|
||
5 4
|
||
10 10 10 10
|
||
9 8 9 6 5
|
||
|
||
答案:79
|
||
|
||
*/
|
||
int getMoney(int begin, int end) { // 左闭右开
|
||
int length = 0;
|
||
for (int i = begin; i < end; i++) length += v[i];
|
||
|
||
if (r >= length) {
|
||
// 不用加油
|
||
r -= length;
|
||
return 0;
|
||
} else {
|
||
// 需要加油, 计算加多少油: 油箱的油还有剩余,还能跑几公里
|
||
int add = ceil((length - r) / d);
|
||
// 计算加油费用
|
||
int x = a[begin] * add;
|
||
// 跑到 end, 油箱的油还能跑几公里
|
||
r = add * d + r - length;
|
||
return x;
|
||
}
|
||
}
|
||
|
||
signed main() {
|
||
cin >> n >> d; // n个站点,每升油可以让车前进d公里
|
||
for (int i = 1; i < n; i++) cin >> v[i]; // 站点间的距离 a1~a2,a2~a3,...
|
||
for (int i = 1; i <= n; i++) cin >> a[i]; // 不同站点加油的价格
|
||
|
||
int i = 1;
|
||
while (i < n) {
|
||
int j = i + 1;
|
||
// 找到下一个便宜的加油站
|
||
while (j <= n && a[j] >= a[i]) j++;
|
||
money += getMoney(i, j);
|
||
i = j;
|
||
}
|
||
cout << money << endl;
|
||
} |