「蓝桥杯」扫地机器人

news/2024/12/2 16:49:15/

扫地机器人

题目描述

小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所示。

1647553622012

走廊内部署了 K 台扫地机器人,其中第 i 台在第 A_i 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净。

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

  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。

接下来 KK 行,每行一个整数 A_i。

其中, 1 ≤ K < N ≤ 1 0 5 1 \leq K < N \leq 10^5 1K<N105 1 ≤ A i ≤ N 1 \leq A_i \leq N 1AiN

输出描述

输出一个整数表示答案。

样例

#1

10 3
5
2
10
6

提示

解析

题目要求多个机器人一起扫地,需要最少多少时间可以全部扫完,根据贪心思想,既然我们有 K 台机器人,路程为 N,那么我们自然是要把路程均分给每台机器人才可以得到最少时间,每台机器人负责 N/K 区域。

题目还说机器人起点出发最终会回到起点,即 a → b 、 b → c 、 c → d a\rightarrow b、b\rightarrow c、c \rightarrow d abbccd 最终还得 d → c 、 c → b 、 b → a d \rightarrow c、c \rightarrow b、b \rightarrow a dccbba 回来,也就是说扫了 4 个距离,花费了 6 时间,不管从 a 、 b 、 c 、 d a、b、c、d abcd 那个位置为起点,亦是如此,因此我们可以根据机器人扫的距离得到时间 ( 距离 − 1 ) × 2 (距离 - 1) \times 2 (距离1)×2

给定一个每台机器人能扫的距离 m,校验每台机器人扫了 m 距离后,能否扫完整个路程,若可以则继续缩小 m ,否则扩大 m,从这里就能看得出来只是二分思想。

分析一下机器人扫地情况:

1647555417796

  • A 2 A_2 A2 机器人可以扫到 L
  • A 1 A_1 A1 机器人左边已经被扫过了,不用扫了

AC Code

public class Main {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));public static void main(String[] args) throws Exception {int n = nextInt(), m = nextInt();int[] A = new int[n + 1];for(int i = 1; i <= m; i++) A[i] = nextInt();Arrays.sort(A, 1, m + 1);int left = 0, right = n;int ans = 0;while(left <= right) {int mid = (left + right) >>> 1;if(check(A, mid, m, n)) {right = mid - 1;ans = mid;} else {left = mid + 1;}}System.out.println((ans - 1) * 2);}public static boolean check(int[] A, int p, int m, int n) {int L = 0; // 从左边开始,机器人已经扫完了 L 距离for(int i = 1; i <= m; i++) {if(A[i] - p <= L) { // 机器人 A[i] 可以扫到 L if(A[i] <= L && A[i] + p > L) // 机器人 A[i] 左边已经被扫完了,不用扫了L = A[i] + p - 1; else L = L + p;} else { // 无法扫到 Lreturn false;}}return L >= n; // 是否扫完}public static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
}

http://www.ppmy.cn/news/58329.html

相关文章

浅聊一下cmake

浅聊一下cmake 什么是cmake CMake是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。 只要生成一份CMakeLists.txt文档&#xff0c;就可以利用CMake进行工程的搭建&#xff0c;能够输出各种各样的makefile或者project文件。 什么是makefile makefile定义…

Docker部署spring boot项目

在docker部署时首先要保证一般部署能够访问。 docker命令部署spring boot项目 目前主流的java框架为spring&#xff0c;软件包为jar包&#xff0c;只需以jar为基础构建容器环境。打包为jar后只需要jvm就可以运行&#xff0c;因此需要以jdk为镜像构建容器。 基于命令构建jdk环…

[C++基础]-类和对象(下)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、深入学…

C++三大特性—继承“名字搜索与默认成员函数”

继承中的类的作用域 每个类定义自己的作用域&#xff0c;在这个作用域中定义自己的成员。当存在继承关系时&#xff0c;派生类的作用域嵌套在基类的作用域之中。如果一个名字在派生类的作用域中无法解析&#xff0c;那么编译器将继续在外层的基类中寻找该名字的定义。 继承关系…

运维——ssh无法登录云服务器

0x00 概述 一般来讲&#xff0c;无法登录ssh的原因挺多&#xff0c;如果无法登录云服务器&#xff0c;则除了要检查ssh端口是否放行&#xff0c;防火墙状态外&#xff0c;还需要检查云服务器web控制台入站规则是否开放了对应端口。如果你前面检查都是正常&#xff0c;那么还需…

你的个人AI助理Pi来了

还记得之前的文章《不要老盯着ChatGPT&#xff0c;这几家公司的产品同样不容小觑》提到的Inflection AI公司吗&#xff1f;通过其官方推文了解到&#xff0c;前期我们关注的个人AI助理有了新的进展&#xff0c;Pi开始对外发布。 Pi是什么 Pi 是一种 AI&#xff0c;一种旨在提供…

数据库之约束、索引和事务

一、约束 约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性. 1.not null - > 数据元素非空 表示如果插入数据,则当前数据不能为空. //创建一张学生表,其班级id和年级id不为空 create …

项目集的定义及管理

一、什么是项目集 项目集是相互关联且被协调管理的项目、子项目集和项目集活动&#xff0c;以便获得分别管理所无法获 得的效益。 以项目集的形式管理项目、子项目集及项目集活动能确保项目集组件的战略和工作计划根据各组 件的成果做出相应调整&#xff0c;或者按照发起组织的…