#6818. 机器人清理垃圾
机器人清理垃圾
机器人清理垃圾
题目描述
城市中有一条笔直的道路,道路两旁放置着 n 个垃圾桶。
每个垃圾桶都有一个唯一编号:
1 2 3 ... n
机器人每天都会按照固定规则清理垃圾桶。
每天清理规则如下:
- 从当前垃圾桶队列的最左侧开始;
- 清理第 1 个垃圾桶;
- 跳过后面的 2 个垃圾桶;
- 清理下一个垃圾桶;
- 按照相同规则继续,直到当天扫描结束;
- 被清理的垃圾桶从队列中移除;
- 剩余垃圾桶保持原来的相对顺序,向左靠拢,形成新的队列;
- 第二天继续执行相同操作。
现在请你计算:
编号为 x 的垃圾桶第几天会被机器人清理。
输入格式
输入一行两个整数:
n x
其中:
n表示垃圾桶总数量;x表示需要查询的垃圾桶编号。
输出格式
输出一个整数:
day
表示编号为 x 的垃圾桶第几天被清理。
数据范围
1 ≤ x ≤ n ≤ 10000
样例
输入
8 5
样例解释
初始垃圾桶:
1 2 3 4 5 6 7 8
第一天
机器人从第1个垃圾桶开始:
清理位置:
1 4 7
对应编号:
1 4 7
剩余:
2 3 5 6 8
第二天
重新排列后:
2 3 5 6 8
注意:
垃圾桶的位置重新计算。
当前位置:
位置:
1 2 3 4 5
编号:
2 3 5 6 8
机器人清理第:
1 4
个垃圾桶。
对应编号:
2 6
剩余:
3 5 8
第三天
当前队列:
3 5 8
清理:
3 8
剩余:
5
第四天
当前:
5
清理:
5
编号为 5 的垃圾桶在第4天被清理。
输出
4
样例2
输入
10 10
过程:
初始:
1 2 3 4 5 6 7 8 9 10
第一天:
清理:
1 4 7 10
因为编号10的垃圾桶第1天被清理。
输出:
1
解题提示
本题属于:
状态模拟问题
需要模拟每天垃圾桶队列的变化。
可以使用两个数组:
a数组:
保存当前垃圾桶排列
b数组:
保存清理后新的垃圾桶排列
每天:
- 遍历当前数组;
- 判断当前位置是否需要清理;
- 如果清理的是编号
x,记录当前天数; - 未清理的垃圾桶加入新数组;
- 更新状态。
注意事项
1. 清理的是位置,不是编号
例如:
当前垃圾桶:
2 3 5 6 8
位置:
1 2 3 4 5
机器人清理:
第1个、第4个
所以清理:
2 6
不是:
1 4 7
因为编号和位置已经不同。
2. 每天重新计算位置
错误:
一直按照原编号判断
正确:
每天根据新的垃圾桶队列重新编号位置
| 测试点编号 | n | x | 标准输出 | 难度层级 | 数据特征 | 设计目的 |
|---|---|---|---|---|---|---|
| 1 | 弱数据 | 最小规模 | 检验唯一元素 | |||
| 2 | 第 1 天后只剩目标 | 检验第二轮更新 | ||||
| 3 | 目标连续保留 | 检验多轮循环 | ||||
| 4 | 1 | 初始第 4 个位置 | 卡“只清理第 1 个”的错误 | |||
| 5 | 10 | 8 | 5 | 正常数据 | 小规模较晚清理 | 检验位置变化 |
| 6 | 10 | 1 | 末尾编号第 1 天清理 | 卡“编号越大越晚”的错误 | ||
| 7 | 20 | 18 | 7 | 中等规模较晚清理 | 检验多轮稳定性 | |
| 8 | 14 | 4 | 中等规模中间层 | 覆盖普通多轮情况 | ||
| 9 | 50 | 41 | 9 | 较多轮清理 | 拉开答案层次 | |
| 10 | 999 | 710 | 16 | 极限数据 | 大规模较晚清理 | 检验循环次数与数组更新 |
| 11 | 10005 | 10005 | 2 | 数组上限附近末尾编号 | 检验边界规模 | |
| 12 | 8091 | 22 | 数组上限附近最晚层级 | 检验极端多轮清理 | ||
相关
在以下作业中: