A35534. 公路(road)
填空题
较难
知识点
题目描述
公路(road)
题目描述
小苞准备开着车沿着公路自驾。
公路上一共有n个站点,编号为从1到n。其中站点i与站点i+1的距离为vi公里。
公路上每个站点都可以加油,编号为i的站点一升油的价格为ai元,且每个站点只出售整数升的油。
小苞想从站点1开车到站点n,一开始小苞在站点1且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进d公里。问小苞从站点1开到站点n,至少要花多少钱加油?
输入格式
从文件road.in中读入数据。
输入的第一行包含两个正整数n和d,分别表示公路上站点的数量和车每升油可以前进的距离。
输入的第二行包含n−1个正整数v1,v2...vn−1,分别表示站点间的距离。
输入的第二行包含n个正整数a1,a2...an,分别表示在不同站点加油的价格。
输出格式
输出到文件road.out中。
输出一行,仅包含一个正整数,表示从站点1开到站点n,小苞至少要花多少钱加油。
样例1输入
1 5 4
2 10 10 10 10
3 9 8 9 6 5
样例1输出
1 79
样例1解释
最优方案下:小苞在站点1买了3升油,在站点2购买了5升油,在站点4购买了2升油。

参考答案
#include<iostream>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
int v[N],a[N];
int main()
{
int n, d;//站点数量和每升油可前进距离
cin >> n >> d;
for (int i = 1; i < n; ++i)cin >> v[i];//站点间的距离
for (int i = 1; i < n; ++i)cin >> a[i];//不同站点加油价格
ll res = 0, oil = 0, list = 0;
int price = a[1];
for (int i = 2; i <= n; i++)
{
list += v[i - 1];
ll t = (list + d - 1) / d - oil;//需要的油
res += t*price;
oil += t;
price = min(price, a[i]);
}
cout<<res;
return 0;
}
上一题
下一题