#6818. 机器人清理垃圾

机器人清理垃圾

机器人清理垃圾

题目描述

城市中有一条笔直的道路,道路两旁放置着 n 个垃圾桶。

每个垃圾桶都有一个唯一编号:

1 2 3 ... n

机器人每天都会按照固定规则清理垃圾桶。

每天清理规则如下:

  1. 从当前垃圾桶队列的最左侧开始;
  2. 清理第 1 个垃圾桶;
  3. 跳过后面的 2 个垃圾桶;
  4. 清理下一个垃圾桶;
  5. 按照相同规则继续,直到当天扫描结束;
  6. 被清理的垃圾桶从队列中移除;
  7. 剩余垃圾桶保持原来的相对顺序,向左靠拢,形成新的队列;
  8. 第二天继续执行相同操作。

现在请你计算:

编号为 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数组:
保存清理后新的垃圾桶排列

每天:

  1. 遍历当前数组;
  2. 判断当前位置是否需要清理;
  3. 如果清理的是编号 x,记录当前天数;
  4. 未清理的垃圾桶加入新数组;
  5. 更新状态。

注意事项

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 数组上限附近最晚层级 检验极端多轮清理

相关

在以下作业中:

递推