2099:【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 解释】

最优方案下:小苞在站点 1
买了 3
升油,在站点2
购买了 5
升油,在站点 4
购买了 2
升油。

【数据范围】

对于所有测试数据保证:1≤n≤10^5
,1≤d≤10^5
,1≤vi≤10^5
,1≤ai≤10^5

【思路】贪心加模拟

#include <bits/stdc++.h>
using namespace std;
const long long MAXN=1e5+5;
long long a[MAXN],v[MAXN];
long long n,d,last=0,ans=0,road=0;
double oil=0.0; 
int main()
{
    cin>>n>>d;
    for(long long i=0;i<n-1;i++) 
	cin>>v[i];
    
	for(long long i=0;i<n;i++) 
	cin>>a[i];
	
	for(long long i=0;i<n;i++){
		if(a[i]<a[last]||i==n-1){
			if(oil*d<road){
				ans+=ceil((road-oil*d)/d)*a[last];//基础数学公式
				oil+=ceil((road-oil*d)/d)-road*1.0/d;
			}
			else{
				oil-=road*1.0/d;
			}
			road=0;
			last=i;
		}
		road+=v[i];
	} 
	cout<<ans;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值