当前位置: 首页 > news >正文

【蓝桥杯 2024 省 C】挖矿

【蓝桥杯 2024 省 C】挖矿


蓝桥杯专栏:2024 省 C
算法竞赛:技巧,前缀和,双指针,贪心
题目链接:洛谷【蓝桥杯 2024 省 C】挖矿

题目描述:
小蓝正在数轴上挖矿,数轴上一共有 nnn 个矿洞,第 iii 个矿洞的坐标为 aia_iai。小蓝从 000 出发,每次可以向左或向右移动 111 的距离,当路过一个矿洞时,就会进行挖矿作业,获得 111 单位矿石,但一个矿洞不能被多次挖掘。小蓝想知道在
移动距离不超过 mmm 的前提下,最多能获得多少单位矿石?

输入格式:
输入的第一行包含两个正整数 n,mn,mn,m,用一个空格分隔。
第二行包含 nnn 个整数 a1,a2,⋯,ana_1, a_2,\cdots, a_na1,a2,,an,相邻整数之间使用一个空格分隔。
输出格式:
输出一行包含一个整数表示答案。

数据范围:
对于 20%20\%20% 的评测用例,1≤n≤1031 \le n \le 10^31n103
对于所有评测用例,1≤n≤1051 \le n \le 10^51n105−106≤ai≤106-10^6 \le a_i \le 10^6106ai1061≤m≤2×1061 \le m \le 2 \times 10^61m2×106


题目大意

小蓝初始时在原点处,他可以在一维数轴上左右行走,数轴上某个位置处有一个或多个矿洞,每路过一个矿洞就会获得 111 单位矿石,求在移动距离不超过 mmm 的前提下,最多能获得多少单位的矿石。

题目分析

初看有点像区间 DP 问题,然而这比区间 DP 问题简单得多,因为这个问题只有路程这一个限制条件,根据贪心,我们很容易知道,必定存在某种能达到矿石数量最多的方案是先沿某个方向走一定距离然后停止移动或返回原点再向另一个方向走一定距离。

那我们就可以在走过 1∼m1\sim m1m 的每个距离时让小蓝掉头向另一个方向走,这样可以在 O(n)\mathcal{O}(n)O(n) 的时间复杂度内将问题求解出来。

为了确保能在 O(1)\mathcal{O}(1)O(1) 的时间复杂度内知道在 1∼i1\sim i1i−i∼−1-i\sim -1i1 上有多少个矿洞,我们可以使用前缀和的方法预处理出来在两个方向上的矿洞数量前缀和。

我们令左指针 lll 在原点或负半轴上,右指针 rrr 在原点或正半轴上,根据上文所述在某个方向走的距离发生改变,另一个方向上能走的距离也必然发生改变,则可以枚举指针变化情况求解,这里用到了双指针的思想,但具体实现可以不将双指针体现出来。

题目实现

根据上述分析,程序过程如下:

  1. 读入矿洞坐标,在正半轴和负半轴的分别用两个数组记录,在原点的用变量计数即可;
  2. 预处理两个方向上的矿洞数量的前缀和;
  3. 枚举距离 1∼m1\sim m1m,分别求先向负半轴再向正半轴走和先向正半轴再向负半轴走两种情况,每个距离,每种情况取最大值,最终结果还要加上在原点的矿洞。

AC Code

参考代码(C++):

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6+10;
int a[N],b[N],ans,num;
int main()
{int n,m;scanf("%d%d",&n,&m);for (int i=0;i<n;i++){int x;scanf("%d",&x);if (x>0) a[x]++;else if (x<0) b[-x]++;else num++;}for (int i=1;i<=m;i++)a[i]+=a[i-1],b[i]+=b[i-1];for (int i=1;i<=m;i++){int cnt=a[i];if (m-i*2>0) cnt+=b[m-i*2];ans=max(ans,cnt);cnt=b[i];if (m-2*i>0) cnt+=a[m-i*2];ans=max(ans,cnt);}printf("%d",ans+num);return 0;
}

End

感谢观看,如有问题欢迎指出。

更新日志

  1. 2025/8/24 开始书写本篇 CSDN 博客,并完稿发布。
http://www.dtcms.com/a/348856.html

相关文章:

  • K8s 实战:六大核心控制器
  • yggjs_rlayout框架v0.1.2使用教程 01快速开始
  • python---类
  • 服装生产跟单系统是什么?主要功能有哪些?
  • 【51单片机按键控制LED按下位移】2022-11-12
  • 若依4.7.8(springboot2.5.15)升级到4.8.1(springboot3.3.5)并集成Dubbo3客户端
  • cmake--CPack/deb
  • Linux系统编程——网络协议
  • The United Nations Is Already Dead
  • comfyUI背后的一些技术——CLIP
  • LeetCode 热题100——56.合并区间
  • 【Docker项目实战】使用Docker部署轻量级LetsMarkdown文本编辑器
  • kafka基本思路即概念
  • PCIE总线接口TSN网卡
  • 【DeepResearch调研】大模型多跳推理能力的深度解析:瓶颈、去偏研究与前沿进展
  • C++(vector):
  • 笔试——Day48
  • 【C++组件】ODB 安装与使用
  • LeetCode 42.接雨水
  • 【Flex SerialPort】一个基于Qt6的支持自定义按键指令的串口工具
  • 浏览器发送网页详细过程分解
  • 释放工作精力:火语言 RPA 的实用功能与效率提升​
  • VMware centos磁盘容量扩容教程
  • 解决虚拟机network服务启动失败问题
  • Linux中的指令
  • 从字节码层面剖析以太坊智能合约创建原理
  • [OpenVela] 音乐播放器1.0
  • Latent Action在具身智能中的使用
  • C++——多态
  • 【ABAP4】基本语法1