Bootstrap

【23CSPJ普及组】公路(road)

题目描述

小苞准备开着车沿着公路自驾。
公路上一共有n个站点,编号为从1到n。其中站点i与站点i+1的距离为vi公里。
公路上每个站点都可以加油,编号为i的站点一升油的价格为ai元,且每个站点只出售整数升的油。
小苞想从站点1开车到站点n,一开始小苞在站点1且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进d公里。问小苞从站点1开到站点n,至少要花多少钱加油?

输入

输入的第一行包含两个正整数n和d,分别表示公路上站点的数量和车每升油可以前进的距离。
输入的第二行包含n-1个正整数v1,v2…vn-1,分别表示站点间的距离。
输入的第三行包含n个正整数a1,a2…an,分别表示在不同站点加油的价格。

输出

输出一行,仅包含一个正整数,表示从站点1开到站点n,小苞至少要花多少钱加油。

输入样例

5 4
10 10 10 10
9 8 9 6 5

输出样例

79

思路

1.解读题:从第一个站点到第n个站点所花费的油费,而每个站点都可以加整数的油但是油费都可能不同,求最少的油费是多少。
2.首先还是先把n,d,距离和油费输进去。但要注意: 距离是每两个之间的距离,所以是n-1 (我这是从二开始遍历的,所以是n),而油费是每个站点都有的,所以是n (我这是从二开始遍历的,所以是n+1)

long long n,d;
long long a[100009],b[100009];
cin>>n>>d;
a[1]=0;
for (int i=2;i<=n;i++){
	cin>>a[i];
}
for (int i=2;i<=n+1;i++){
	cin>>b[i];
}

3.这道题可以用前缀和的思想来做,就是求出从第一个站点到每一个站点所花费的油 (注意,因为只能加整数的油,所以算出来的值要向上取整也就是n+k-1/k),再两两相减就能求出每两个站点之间所花费的油。

long long ,c1[100009];//数组储存第一个站点到每一个站点所花费的油
long long c[100009];//数组来储存每两个站点之间所花费的油
long long sum=0;//第一个站点到第n个站点的距离
for (int i=1;i<=n;i++){
	sum+=a[i];
	c1[i]=(sum+d-1)/d;
}
for (int i=2;i<=n;i++){
	c[i]=c1[i]-c1[i-1];
}

4.为了求出最低油价,我们还要让汽车开往下一个比目前站点的油价便宜的站点去加下一次的油,就是要用一个变量min1来不断刷新到下一个站点的最低油价,最后再用上面的每两个站点之间所花费的油在每次遍历中乘以min1就是这段路程的油价,最后再加起来输出。
在这里插入图片描述

(点个赞再走吧)

(完整代码如下)

#include<bits/stdc++.h>
using namespace std;
long long n,d;
long long a[100009],b[100009],c1[100009],c[100009];
long long qi=0;
int main(){
	cin>>n>>d;
	a[1]=0;
	for (int i=2;i<=n;i++){
		cin>>a[i];
	}
	for (int i=2;i<=n+1;i++){
		cin>>b[i];
	}
	
	long long sum=0;
	for (int i=1;i<=n;i++){
		sum+=a[i];
		c1[i]=(sum+d-1)/d;
	}
	for (int i=2;i<=n;i++){
		c[i]=c1[i]-c1[i-1];
	}
	
	long long min1=9999999;
	for (int i=2;i<=n;i++){
		min1=min(min1,b[i]);
		qi+=c[i]*min1;
	}
	cout<<qi;
	return 0;
}
;