小苞准备开着车沿着公路自驾。
公路上一共有 n� 个站点,编号为从 11 到 n�。
其中站点 i� 与站点 i+1�+1 的距离为 vi�� 公里。
公路上每个站点都可以加油,编号为 i� 的站点一升油的价格为 ai�� 元,且每个站点只出售整数升的油。
小苞想从站点 11 开车到站点 n�,一开始小苞在站点 11 且车的油箱是空的。
已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进 d� 公里。
问小苞从站点 11 开到站点 n�,至少要花多少钱加油?
输入格式
输入的第一行包含两个正整数 n� 和 d�,分别表示公路上站点的数量和车每升油可以前进的距离。
输入的第二行包含 n−1�−1 个正整数 v1,v2…vn−1�1,�2…��−1,分别表示站点间的距离。
输入的第三行包含 n� 个正整数 a1,a2…an�1,�2…��,分别表示在不同站点加油的价格。
输出格式
输出一行,仅包含一个正整数,表示从站点 11 开到站点 n�,小苞至少要花多少钱加油。
数据范围
对于所有测试数据保证:1≤n≤1051≤�≤105,1≤d≤1051≤�≤105,1≤vi≤1051≤��≤105,1≤ai≤1051≤��≤105。
特殊性质 A�:站点 11 的油价最低。
特殊性质 B�:对于所有 1≤i<n1≤�<�,vi�� 为 d� 的倍数。
简单思维:组照第一个加油站之外下一个更便宜的加油站,计算距离,需要油量,计算剩余油量。
不说了,上代码,注释掉的是我自己写的一部分代码,思路也对但是小麻烦。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int v[N], a[N];
int n, d; // 站点数量,每升油前进的距离
int main ()
{
scanf ("%d %d", &n, &d);
// 站点间距
for (int i = 1; i <= n-1; ++i)
scanf ("%d", &v[i]);
// 油价
for (int i = 1; i <= n; ++i)
scanf ("%d", &a[i]);
// int val = 0; // 邮箱中油量跑多少公里
// int MinDistance = 0, sum1 = 0, sum = 0; // 到更便宜的站点的距离,需要的钱, 总共需要的钱
LL res = 0, oil = 0, dist = 0; // 价格、当前油箱里油的量、距离
int price = a[1]; // 最低价格
// int local = 1; // 当前地址
for (int i = 2; i <= n; ++i)
{
dist += v[i-1];
LL t = (dist+d-1)/d-oil; //还差多少油。(dist+d-1)/d上取整转换为下去整
res += t*price;
oil += t;
price = min(price, a[i]);
}
printf ("%lld\n", res);
}