2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人


Ideas

首先我们根据数学常识可以知道,当每个机器人清扫的范围差不多时,最好都是 N / K,花的时间应该是最少的。

所以这道题实际上就是让我们搜索每个机器人负责清扫的范围,我们假设这个范围是x。

既然是搜索,那么首先想到的就是二分,不断的缩小x的过程中确保所有机器人的清扫范围能够覆盖N个方格。

二分不是很麻烦,所以重点是确保所有机器人的清扫范围能够覆盖N个方格。

给定一个x之后,我们可以遍历每个机器人所在的位置依次判断,因为题目中给出的机器人的位置并不是有序的,所以读入数据之后还要先排序。

我们可以设置一个 total 变量,表示从左到右依次能够清扫的范围。

对于每一个机器人所在的位置k[i],如果k[i] - x,也就是机器人能够清扫的左边界小于total的话,分成两种情况:

  1. k[i] < total: 说明前面一个机器人k[i - 1]能够清扫的右边界达到k[i]的起始位置,那么第i个机器人就不用往左边走了,此时前i个机器人能够清扫的total = k[i] + x - 1;
  2. k[i] >= total: 说明前面一个机器人k[i - 1]能够清扫的右边界没有达到k[i]的起始位置,那么第i个机器人就需要往左边清扫,而此时前i个机器人能够清扫的total = total + x;

如果 k[i] - x > total 的话,也就是第 i 个机器人能够清扫的左边界都大于前 i - 1 个机器人能够清扫到的范围,那说明这个 x 选的太小了,得增大范围。

最后找到了合适的 x 之后,那么花费时间最长的机器人,就是这个机器人的位置正好在 x 的中间,它需要先往左扫,再回来,然后往右扫,再回来,所以花费的最长时间为 (x - 1) * 2。

然后我们就可以开始写代码啦。

Code

C++

#include <iostream>
#include <algorithm>using namespace std;const int maxn = 1e5+7;
int n, m;
int robot_list[maxn];bool check(int x) {int total = 0;for (int i = 0; i < m; i++) {if (robot_list[i] - x < total + 1) {if (robot_list[i] < total + 1) {total = robot_list[i] + x - 1;} else {total += x;}} else {return false;}}return total > n - 1;
}int main() {cin >> n >> m;for (int i = 0; i < m; i++) {cin >> robot_list[i];}sort(robot_list, robot_list + m);   int left = 0, right = n, middle, ans;while (left < right + 1) {middle = (right + left) >> 1;if (check(middle)) {right = middle - 1;ans = middle;} else {left = middle + 1;}}cout << (ans - 1) * 2 << endl;return 0;
}

Python

def check(x):total = 0   # 前面的机器人能够清扫的右边界,初始化为0for i, v in enumerate(robot_list):if v - x < total + 1:if v < total + 1:total = v + x - 1else:total += xelse:return Falsereturn total > n - 1if __name__ == '__main__':# 1. 处理输入数据n, k = map(int, input().split())robot_list = []for _ in range(k):robot_list.append(int(input()))robot_list.sort()# 2. 二分查找left, right, ans = 0, n, nwhile left < right + 1:middle = (right + left) >> 1if check(middle):   # 如果此时确定的清扫范围可以满足条件则继续缩小范围ans = middleright = middle - 1else:left = middle + 1print((ans - 1) * 2)

在线评测:https://www.acwing.com/problem/content/3179/

2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人相关推荐

  1. java迷宫类编程题_第十届蓝桥杯省赛java类B组 试题 E:迷宫 (动态规划之回溯法)...

    问题描述 试题 E: 迷宫 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为 ...

  2. 第十届蓝桥杯省赛C/C++B组题解与感想

    第一次参加蓝桥杯的感想和总结 1.本次比赛整体而言其实是发挥出了正常的水平的,考试的发挥也算正常(有点受考试环境的影响:1.考试题目以图片形式给出2.控制台复制粘贴受限,但是这都不是主要的原因,),但 ...

  3. 2019第十届蓝桥杯省赛C/C++B组题解

    作为很久很久没有写过算法题的考研狗 OvO(是这样的,卑微考研),我于今年再次参加了蓝桥杯... 大家都说这次蓝桥杯简单,我也是这么觉得的(或者说是我运气好),或者说是考细节吧(虽然我也没怎么考虑细节 ...

  4. 2019年第十届蓝桥杯省赛B组真题解析

    A 组队 试题A 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球员担任 1号位至 5号位时的评分如下表所示.请你计算首 ...

  5. 【蓝桥杯】2019年第十届蓝桥杯省赛B组试题J — 灵能传输(前缀和,猜想结论)难度⭐⭐⭐⭐

    整理的算法模板合集: ACM模板 蓝桥杯的题还是有难题的.这道题的可行性证明比较麻烦,但是代码比较简单. 学到了新的序列操作.前缀和的应用,前缀和还是学的不够扎实,晚上再复习一遍. #include& ...

  6. 第十届蓝桥杯省赛C/C++B组省赛题解(留下了不学无术的泪水)

    本人广东某本科院校大二O-O,第二次参加蓝桥杯,大一第一次参加 划水拿了个三等- (更新 拿了省一 好开心 要去北京啦 今天还是我生日!) 废话不多说进入正题!! 第一题 试题 A: 组队 本题总分: ...

  7. 第十届蓝桥杯国赛java_2019年第十届蓝桥杯国赛总结(JavaA组)

    JavaA组国二,可以报销了~ JA死亡之组可不是盖的,rank12的排名还是拿不到国一啊(只有五个.. 出成绩的一刻波澜不惊,毕竟去年有国一了不慌哈哈哈 不过对我来说这个结果还算意料之外吧,毕竟大三 ...

  8. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - B. 矩形切割

    题目链接:https://www.lanqiao.cn/courses/2786/learning/?id=67815 Ideas 对于一个矩形来说,能切割下来的正方形肯定是以较短的那条边为边长,然后 ...

  9. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - D. 质数

    Ideas 本来一开始想到的是质数筛,但是埃式筛是用来筛选 n 以内的所有质数,并不能找到第 n 个质数,除非找到一个足够大的 n 能够把第 2019 个质数包含进去. 可能质数筛还有升级,能够用来找 ...

最新文章

  1. ubuntu终端显示乱码的解决
  2. 一个简单的高并发的回应服务器(5万并发)
  3. spring boot / cloud (七) 使用@Retryable来进行重处理
  4. srt编辑的文件在linux显示乱码,解决看本地视频srt字幕乱码问题教程-srt文件
  5. 关于函数指针调用C++非静态成员
  6. AJAX使用技巧:如何处理书签和翻页按扭
  7. 程序的图标无法改变_想体验程序猿日常工作的快乐吗?来玩国产烧脑益智游戏《异常》...
  8. python之gunicorn的配置
  9. python mongodb_python实现mongodb的增删改查
  10. 力扣-606. 根据二叉树创建字符串
  11. 只读的泛型集合(IList(Of T))
  12. EOS技术研究:合约与数据库交互
  13. 文档服务器拓扑图,服务器网络结构拓扑图
  14. HDU 4699 Editor (对顶栈)
  15. leetcode 最常见的150道前端面试题(简单题下)
  16. 《让子弹飞》系列——张麻子的斗争策略
  17. [小样本医学图像]Generalized Organ Segmentation by Imitating One-shot Reasoning using Anatomical Correlation
  18. Html监听Fbx文件加载,Three.js 导入fbx
  19. 自定义圆环形进度条实现
  20. lammps教程:均方位移MSD计算方法介绍

热门文章

  1. [19/04/11-星期四] 多线程_并发协作(生产者/消费者模式_2种解决方案(管程法和信号灯法))...
  2. Plupload上传插件中文文档
  3. 解题报告:hdu 1276 士兵队列训练问题 - 简单题
  4. ctrl shift o失效
  5. !!从中位数市盈率看目前市场位置
  6. BZOJ 1055 [HAOI2008]玩具取名
  7. 跑monkey需要安装什么_坤秀为您解析无漆木门安装需要注意什么?
  8. 天津盈克斯机器人科技_网红新科技,走进家居新时代|环渤海爱乐屋门窗amp;威卢克斯天窗双旦狂欢节送您一个温暖的家!...
  9. 1.7-33编程基础之字符串 33:判断字符串是否为回文
  10. python最小值函数_Python3 min() 函数详解 获取多个参数或列表中的最小值