首页 > 其他分享 >CSP历年复赛题-P9749 [CSP-J 2023] 公路

CSP历年复赛题-P9749 [CSP-J 2023] 公路

时间:2024-06-20 15:36:54浏览次数:10  
标签:10 12 int P9749 long 距离 2023 加油 CSP

原题链接:https://www.luogu.com.cn/problem/P9749

题意解读:有n个加油点,每个加油点距离、油价不同,每升油走d公里,加油必须整升加,问走完所有点最少加油的金额。

解题思路:

本题有两种思考方式:

1、先走,再看油从哪里加

依次走到第2,3,4......n个加油点,看每两个点之间距离需要加多少油

由于每个加油点加油只能加整数升,这样到每个点可能会剩余一些油,还能走一些距离

所以从第i-1点走到第i点时,要计算两点之间需要加多少油,距离不应该是s[i] - s[i-1],而是s[i] - 在i-1点以前加的油能走的总距离

当走到第i点时,知道了相比i-1点需要再加多少油,那么油价是多少呢?

这里是贪心选择,当然选之前出现的加油点中油价最低的!

样例模拟:

5 4
10 10 10 10
9 8 9 6 5

到第1个点:走过的总路程为0,加油金额为0

到第2个点:走过的总路程为10,应该从第1个点加油,加油量为⌈10/4⌉=3,金额3*9=27,加完油后可以走的总路程为3*4=12

到第3个点:走过的总路程为20,上一次加油能走的总路程12,还需要走20-12=8公里,应该从第2个加油点加油,加油量为⌈8/4⌉=2,金额2*8=16,加完油后可以走的总路程为12+2*4=20

到第4个点:走过的总路程为30,上一次加油能走的总路程为20,还需要走30-20=10公里,应该从第2个加油点加油,加油量为⌈10/4⌉=3,金额3*8=24,加完后可以走的总路程为20+3*4=32

到第5个点:走过的总路程为40,上一次加油能走的总路程为32,还需要走40-32=8公里,应该从第4个加油点加油,加油量为⌈8/4⌉=2,金额2*6=12

总加油金额为:27+16+24+12=79

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
int n, d;
int v[N], a[N];

int main()
{
    cin >> n >> d;
    for(int i = 2; i <= n; i++) cin >> v[i]; 
    for(int i = 1; i <= n; i++) cin >> a[i]; //每个加油站加油的价格

    long long ans = 0;
    long long s = 0; //到下一个加油站走过的总距离
    long long last = 0; //到上一个加油站之前加的油能走的总距离
    int minp = INT_MAX; //已走过的加油站最低油价
    for(int i = 2; i <= n; i++) //枚举到每一个加油站
    {
        s += v[i];
        minp = min(minp, a[i - 1]); //i号加油站之前的最低油价
        long long oil = (s - last + d - 1) / d; //i-1到i号需要加的油,距离除以d向上取整
        ans += oil * minp; //在已走过的最低价加油站加油
        last += oil * d; //可以走的总距离更新
    }
    cout << ans;

    return 0;
}

2、先加油,看能走到哪里

从1号点开始,考虑最少应该加多少油

显然,应该加的油至少保证刚好走到下一个价钱更低的加油点,如果下一个价钱更低的加油点在上一次加油后有余量可以到达,应该跳过继续往后找价钱低的加油点,直到走到n号点

此方式思考起来比较简单,但是代码实现相比第一种更麻烦,先给出样例模拟。

样例模拟:

5 4
10 10 10 10
9 8 9 6 5

到第1个点:下一个价格更低的点是2,距离是10,加油量应该是⌈10/4⌉=3,金额3*9=27,可以走到距离3*4=12

到第2个点:下一个价格更低的点是4,距离是30-12 = 18,加油量应该是⌈18/4⌉=5,金额5*8=40,可以走到距离12+5*4=32

到第4个点:下一个价格更低的点是5,距离是40-32=8,加油量应该是⌈8/4⌉=2,金额2*6=12,可以走到终点

总加油金额为:27+40+12=79

编写代码时,需要注意,在寻找下一个加油点时,应该先跳过上一次加油后能到达的所有加油点,然后再找价格更低的加油点。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
int n, d;
int v[N], a[N];
long long s[N]; //s[i]表示到第i个加油点的总距离

int main()
{
    cin >> n >> d;
    for(int i = 2; i <= n; i++)
    {
        cin >> v[i];
        s[i] = s[i-1] + v[i]; 
    } 
    for(int i = 1; i <= n; i++) cin >> a[i]; 

    long long ans = 0;
    long long last = 0; //加油后能走过的总距离
    for(int i = 1; i < n; i++) //枚举每一个加油点
    {
        int j = i + 1;
        while(s[j] <= last && j < n) j++; //跳过加油后能到达的点
        while(a[j] >= a[i] && j < n) j++;  //找下一个价格更低的加油点,直到最后一个点
        long long x = s[j] - last; //下一个加油点总距离 到 上一次加油后能走的总距离 的 差值,即还需要加油才能走过的距离
        long long oil = (x + d - 1) / d; //需要加的油量
        ans += oil * a[i]; //加油金额
        last += oil * d; //加油后能走过的总距离
        i = j - 1; //下一个加油点是j
    }
    cout << ans;

    return 0;
}

 

标签:10,12,int,P9749,long,距离,2023,加油,CSP
From: https://www.cnblogs.com/jcwy/p/18258716

相关文章

  • Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)
    前言Matlab(矩阵实验室)是全球领先的数学计算软件开发商美国MathWorks公司研发的一款面向科学与工程计算的高级语言的商业数学软件,集算法开发、数据分析、可视化和数值计算于一体的编程环境,其核心是仿真交互式矩阵计算,广泛应用于科学计算、数据分析、算法开发和绘图设计等......
  • CSP历年复赛题-P9748 [CSP-J 2023] 小苹果
    原题链接:https://www.luogu.com.cn/problem/P9748题意解读:n个苹果,每天从第1个开始,每三个苹果拿走第一个,问几天拿完,最后一个苹果第几天拿走。解题思路:由于每三个苹果拿一个,每天拿走的苹果数量是⌈n/3⌉,即(n+2)/3n每天都要减去(n+2)/3,直到n为0,记录天数即可得到总天数最......
  • 2024年BCSP-X初赛真题解析(小高组)
    学习C++从娃娃抓起!学习下帝都的对标CSP的BCSP考试,记录下CSP-J备考学习的每一个瞬间。单选题第1题计算机在工作过程中突然停电,()中的信息不会丢失。A.显存B.寄存器C.RAMD.ROM【答案】:D第2题中缀表达式a*(b+c)-d的后缀形式是()。A.abcd*±B.abc+*d-C.abc*+d-D.-+......
  • 李宏毅2023机器学习作业HW06解析和代码分享
    ML2023Spring-HW6相关信息:课程主页课程视频SamplecodeHW06视频HW06PDF个人完整代码分享:GitHub|Gitee|GitCodeP.S.HW06是在Judgeboi上提交的,出于学习目的这里会自定义两个度量的函数,不用深究,遵循Suggestion就可以达成学习的目的。每年的数据集si......
  • CSP历年复赛题-P8815 [CSP-J 2022] 逻辑表达式
    原题链接:https://www.luogu.com.cn/problem/P8815题意解读:计算逻辑表达式的值以及&,|短路操作的次数。解题思路:又是一道经典的中缀表达式的变形问题,如果对中缀表示式如何求值不理解,移步https://www.acwing.com/problem/content/3305/进行复习如果对表示式如何构建树形结构以及......
  • SEETF-2023 express-javascript-security ejs相关漏洞
    今天做个ejs相关题目。进入页面只发现一个输入框,题目标签是ejs相关,去github看看源码,发现ejs版本为3.1.9,可以确定地是rce漏洞。接下来说说这个rce漏洞。3.1.9版本的rce漏洞主要是因为使用了这个模板来构建网页逻辑导致的。点击查看代码//index.jsconstexpress=require('e......
  • 智能制造 | 璞华科技入选「2023年苏州市智能制造优秀服务商」名单
    刚刚,璞华科技入选「2023年苏州市智能制造优秀服务商」公示名单!再次表明,璞华科技在智能制造领域的实力得到了业界认可。璞华科技有限公司是一家以“帮助客户实现数智化转型升级”为愿景的高科技企业,在苏州、武汉、北京、香港、东京等地拥有多个业务据点,在行业数智化领域帮助客户......
  • 如何使用csproj构建C#源代码组件NuGet包?
    一般我们构建传统的NuGet包,都是打包和分发dll程序集文件。至于打包和分发C#源代码文件的做法,比较少见。那么这种打包源代码文件的做法,有什么优点和缺点呢?优点:方便阅读源代码。方便断点调试。减少Assembly程序集模块加载个数。更利于发布期间的剪裁(PublishTrimmed选项)。......
  • 如何使用csproj构建C#源代码组件NuGet包?
    一般我们构建传统的NuGet包,都是打包和分发dll程序集文件。至于打包和分发C#源代码文件的做法,比较少见。那么这种打包源代码文件的做法,有什么优点和缺点呢?优点:方便阅读源代码。方便断点调试。减少Assembly程序集模块加载个数。更利于发布期间的剪裁(PublishTrimmed选项)。......
  • 如何使用csproj构建C#源代码组件NuGet包?
    一般我们构建传统的NuGet包,都是打包和分发dll程序集文件。至于打包和分发C#源代码文件的做法,比较少见。那么这种打包源代码文件的做法,有什么优点和缺点呢?优点:方便阅读源代码。方便断点调试。减少Assembly程序集模块加载个数。更利于发布期间的剪裁(PublishTrimmed选项)。......