2023年csp-j/sT2公路

【题目描述】

小苞准备开着车沿着公路自驾。

公路上一共有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、从样例输入得知:有5个站点, 每升油能走4公里;

                   2、每个站点之间的距离是10公里;

                   3、每个加油站的油价不一样,分别是9、 8 、9 、6 、5,并且不零卖

                   4、最终花费79元加油

一、先计算从第一个站点到第二个站点的花费:

油9元一升,每升油跑4公里,要到达第2个站点,需要

3升油(不零卖)*4公里=12公里      12-10(站点距离)=2公里

也就是说,到达第2个站点时,车里的油还能够多出2公里

二、2号站点到3号站点,依然是10公里距离,油价是8元每升,因为车里有2公里的油

      所以,我们只需要购买2升油,2*4公里=8公里     2升*8元=16元

      如果是这样购买,下一个站点油价是9元一升,如果购买3升的话,就需要3*9=27元

      最终的费用与样例给出的79元不一样,会超过样例数据。

      所以,因为知道这个加油站的油更便宜,也可以一次购买5升油 

      5*8=40元      5升油*4公里=20公里   (可以跨过3号站9元的油价)

三、由于加满了油,跨过3号点(油贵)到达4号站点,车里又还有2公里油,

       所以需要2升油*4公里+2公里(剩余)就能到达,2升*6元=12元

四、第一站花费27元+第二站花费40元+第四站花费12元=总花费79元

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

#include <bits/stdc++.h>
using namespace std;
int n,d;//站点数,每升油能走的公里数 
long long ans=0;//费用 
long long v[100005];//站点距离 
long long a[100005];//加油站价格 
long long y[100005];//
long long youjia;//油价
main() {
    scanf("%d%d",&n,&d);//输入站点,每升油走的公里数 
    for (int i=2;i<=n;i++){  
        scanf("%d",&v[i]); //输入每个加油站距离       
        v[i]+=v[i-1];//计算站点i到起点的距离
        y[i]=ceil(1.0*v[i]/d);//从起点到当前站点的油耗
    }
    for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);//输入每个加油站油价   
    }
    youjia=a[1];//出发先在站点1买油
    for (int i=2;i<=n;i++){
        ans+=youjia*(y[i]-y[i-1]);//增加本段用油的油价        
        youjia=min(youjia,a[i]);//如果当前站点油比用的油便宜,换成当前站点买
    }
    cout<<ans;//输出总费用 
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值