扫地机器人(蓝桥杯)

文章目录

  • 扫地机器人
    • 题目描述
    • 解题思路
    • 二分+贪心

扫地机器人

题目描述

小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示。
在这里插入图片描述
走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净

请你编写一个程序,计算每台机器人的清扫路线,使得

  1. 它们最终都返回出发方格,

  2. 每个方格区域都至少被清扫一遍,

  3. 从机器人开始行动到最后一台机器人归位花费的时间最少。

注意多台机器人可以同时清扫同一方块区域,它们不会互相影响

输出最少花费的时间。在上图所示的例子中,最少花费时间是 6。第一台路线:2-1-2-3-4-3-2,清 扫了 1、2、3、4 号区域。第二台路线 5-6-7-6-5,清扫了 5、6、7。第三台路线 10-9-8-9-10,清扫了 8、9 和 10。

输入描述

第一行包含两个整数 N 和 K。

接下来 K 行,每行一个整数 Ai。

输出描述

输出一个整数表示答案

样例输入

10 3
5
2
10

样例输出

6

解题思路

首先这题需要找到最少花费时间,那么我们先二分机器人的扫地范围,最小为0,最大为n,一旦所有机器人能扫完全程,说明该值是符合条件的,然后二分缩小范围,直到找出最小的值,刚好所有机器人能够扫完全程。

check函数的实现:

  • 首先我们需要明确,mid是机器人的扫地步数,如果mid为1,那么机器人就扫机器人当前的格子。
  • 然后开始贪心思路:我们尽可能让机器人先扫完自己右边的,然后有多余的步数,再扫自己左边的。
  • 情况一:如果a[i]-x>s,就说明机器人扫不完自己右边的格子,直接返回false
    在这里插入图片描述
  • 情况二:如果前一个机器人往右多扫了几格,S应该更新为s = a[i] + x - 1
    在这里插入图片描述
  • 如果上述两种情况都不属于,将s向前推进x个方格s += x
    在这里插入图片描述
  • 最后,如果S大于等于地图范围n,返回true,否则说明机器人没走完全程,返回false
    在这里插入图片描述

二分+贪心

这段代码是一个用于解决扫地机器人问题的C++程序。程序的目的是通过编写一个算法,使得多台扫地机器人能够高效地清扫一个由N个方格区域组成的走廊,并最终返回各自的出发点。下面是对代码的详细注释:

#include<bits/stdc++.h> // 引入C++标准库的头文件,bits/stdc++.h是一个非标准的宏定义,包含了常用的头文件
using namespace std; // 使用标准命名空间,简化标准库中的类和函数的引用// 定义全局变量
int n, k; // n表示走廊的方格数,k表示扫地机器人的数量
int a[100010]; // 数组a用于存储k台扫地机器人的初始位置// check函数用于判断在给定的清扫时间x下,是否所有方格都被清扫过
bool check(int x) {int s = 0; // s表示当前已清扫的方格区域的右边界for(int i = 0; i < k; i++) { // 遍历所有的扫地机器人if(a[i] - x > s) return false; // 如果机器人i需要清扫的区域超出了当前已清扫的范围,则返回falseif(s >= a[i]) s = a[i] + x - 1; // 如果当前已清扫的范围已经包含了机器人i的位置,则更新s为机器人i的清扫结束位置else s += x; // 否则,将s向前推进x个方格}return s >= n; // 如果s到达或超过了走廊的最后一个方格,则说明所有方格都被清扫过,返回true
}int main() {cin >> n >> k; // 从标准输入读取走廊的方格数和机器人的数量for(int i = 0; i < k; i++) // 遍历并读取每台机器人的初始位置cin >> a[i];sort(a, a + k); // 对机器人的初始位置进行排序,这有助于后续的二分查找// 二分查找,查找满足条件的最小时间xint l = 0, r = n; // 定义二分查找的左右边界,初始时左边界为0,右边界为走廊的方格数nwhile(l < r) { // 当左边界小于右边界时,继续查找int mid = l + r >> 1; // 计算中间值midif(check(mid)) r = mid; // 如果在时间x下可以完成清扫,则尝试查找更小的时间else l = mid + 1; // 否则,需要增加时间}cout << 2 * (r - 1) << endl; // 输出最终结果,即2倍的最小时间(因为题目要求的是最少花费的时间的两倍)return 0; // 程序结束
}

这段代码使用了二分查找算法来找到满足条件的最小时间x。在每次迭代中,它都会检查一个中间值是否满足条件,然后根据结果调整查找范围。最终找到的最小时间x是满足所有方格至少被清扫一次且机器人能够返回出发点的最小时间。由于题目要求输出的是这个时间的两倍,所以在输出时乘以2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/586177.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10个最佳3D角色下载站

每个人都喜欢免费的东西。 无论是免费的 3D 角色还是游戏资产&#xff0c;我们都喜欢它们。 以下是可以为你的游戏获取免费 3D 角色的前 10 个网站的列表。 你可以将它们用于多种用途&#xff0c;例如 3D 打印或动画剪辑。 如果需要将下载的3D角色转化为其他格式&#xff0c;可…

TSINGSEE青犀智慧工厂视频汇聚与安全风险智能识别和预警方案

在智慧工厂的建设中&#xff0c;智能视频监控方案扮演着至关重要的角色。它不仅能够实现全方位、无死角的监控&#xff0c;还能够通过人工智能技术&#xff0c;实现智能识别、预警和分析&#xff0c;为工厂的安全生产和高效运营提供有力保障。 TSINGSEE青犀智慧工厂智能视频监…

【反悔贪心】【优先队列】3049. 标记所有下标的最早秒数 II

本文涉及知识点 反悔贪心 堆&#xff08;优先队列&#xff09; 二分查找算法合集 LeetCode3049. 标记所有下标的最早秒数 II 给你两个下标从 1 开始的整数数组 nums 和 changeIndices &#xff0c;数组的长度分别为 n 和 m 。 一开始&#xff0c;nums 中所有下标都是未标记的…

抽象类 与 接口 的区别

前言 这个知识点我之前就已经学过&#xff0c;但是我学的半桶水&#xff0c;就是只理解了比较表面的意思。我第一次面试的时候&#xff0c;面试官刚好就问了我这个问题&#xff0c;我一紧张&#xff0c;回答的磕磕绊绊的&#xff0c;很是尴尬。之后我就反思&#xff0c;发现其…

WordPress外贸建站Astra免费版教程指南(2024)

在WordPress的外贸建站主题中&#xff0c;有许多备受欢迎的主题&#xff0c;如Avada、Astra、Hello、Kadence等最佳WordPress外贸主题&#xff0c;它们都能满足建站需求并在市场上广受认可。然而&#xff0c;今天我要介绍的是一个不断颠覆建站人员思维的黑马——Astra主题。 原…

注册接口和前置SQL及数据生成及封装

注册接口 演示注册接口的三步操作&#xff1a;【注册流程逻辑】 第一步&#xff1a;发送注册短信验证码接口请求 请求方法&#xff1a; put 请求地址&#xff1a;http://shop.lemonban.com:8107/user/sendRegisterSms 请求参数&#xff1a;{“mobile”:“13422337766”} 请求头…

[实时流基础 flink] 窗口

在批处理统计中&#xff0c;我们可以等待一批数据都到齐后&#xff0c;统一处理。但是在实时处理统计中&#xff0c;我们是来一条就得处理一条&#xff0c;那么我们怎么统计最近一段时间内的数据呢&#xff1f;引入“窗口”。 文章目录 6.1 窗口的概念6.2 窗口的分类**1&#x…

C语言第三十八弹---编译和链接

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理&#xff08;预编译&#xff09; 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…

rs485自动收发电路

R/RO&#xff1a;receive/receive out&#xff0c;接收&#xff0c;连接单片机的 rx D/DI&#xff1a;drive/drive in&#xff0c;驱动&#xff0c;连接单片机的 tx 自动控制电路的目的就是在 tx 空闲&#xff08;空闲为高并&#xff09;时拉低 RE 和 DE&#xff0c;工作&…

open Gauss 数据库-04 openGauss数据库日志管理指导手册

发文章是为了证明自己真的掌握了一个知识&#xff0c;同时给他人带来帮助&#xff0c;如有问题&#xff0c;欢迎指正&#xff0c;祝大家万事胜意&#xff01; 目录 前言 openGauss 数据库日志管理 1 实验介绍 2 实验目的 3 系统日志 3.1 运行时日志 3.2 安装卸载时日志…

gin源码分析(1)--初始化中间件,路由组与路由树

目标 关于gin.Default()&#xff0c;gin.New()&#xff0c;gin.Use()group与子group之间的关系&#xff0c;多group与middleware之间关系中间件的类型&#xff0c;全局&#xff0c;group&#xff0c;get&#xff0c;不同类型的中间件什么时候执行。中间件 next 和abort行为如何…

3款必知的AI写作软件,智能写文效率高

在当今信息爆炸的时代&#xff0c;写作已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;随着人们对高效率和高质量写作需求的不断增加&#xff0c;人工智能写作软件应运而生。这些AI写作软件凭借其强大的语言处理能力和智能算法&#xff0c;为写作者们提供了全新的…