2023CSP-J组真题 2. road

本文介绍了解决线上编程题目中关于车辆在有限加油站间的路径规划问题,利用贪心策略和反悔思想,通过计算每个加油站之间的距离和油价,确定最少加油量的C++代码实现。
摘要由CSDN通过智能技术生成

线上OJ:https://www.luogu.com.cn/problem/P9749

解题思想:贪心+反悔。

从左到右考虑,如果行驶到某个加油站,缺油的时候,从之前经过的最便宜的加油站加油即可

核心:与第一道题 apple 的考点相同。向上取整的代码 (m+ (n-1))/n,所以至少要加多少升油表示为 (s+d-1)/d

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int N = 1e5 + 10;

int v[N], a[N];
int n, d;
int main() 
{
    cin >> n >> d;

    for (int i = 1; i < n; i++)	
        cin >> v[i];		// 当前加油站到下一个加油站的距离 

    int mi = INT_MAX;
    ll ans = 0, s = 0;

    for (int i = 1; i < n; i++) 
        {
            cin >> a[i];	// 当前加油站的油价 
            s += v[i];		// 当前加油站到下一个加油站要走的距离(注意,有可能上一轮会多走一段距离) 
            mi = min(mi, a[i]);	// 如果当前加油站油价低,则用当前加油站的油价;否则,用之前的最低油价 
            if (s > 0) 		// 如果此时 s += v[i] 后为正,说明此时需要计算加油;如果为负,则可以不计算,与因为之前多走了 
            {
                ans += (s + d - 1) / d * mi;// (s + d-1)/d 表示至少要加多少升油才能跑到下一个加油站。由数学归纳法得, (s + d-1)/d 是s/d的向上取整 
                s -= (s + d - 1) / d * d;	// 表示这一轮跑完后,下一轮可以少跑的距离。 
            }
        }

    cout << ans;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值