三千里外欲封侯 2024-01-09 22:20 采纳率: 86.4%
浏览 5
已结题

蓝桥扫地机器人 有一处疑问

我的疑点是“step = robot[i] + val-1”,更新扫地机器人扫过的地的范围,
为啥在扫地机器人位置小于已扫过面积的时候要再后面减一
题目:
题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示。

走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中。

已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净

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

它们最终都返回出发方格,
每个方格区域都至少被清扫一遍,
从机器人开始行动到最后一台机器人归位花费的时间最少。
注意多台机器人可以同时清扫同一方块区域,它们不会互相影响

输出最少花费的时间。

#include <iostream>
#include <algorithm>
using namespace std;
const int N =1000005 ;
int n, k, robot[N];
bool check(int val)
{
    int step = 0;
    for (int i = 0; i < k; i++)
    {
        if (abs(robot[i] - step) <= val)//如果下一个机器人所扫半径可以与已扫过面积接上
        {
            if (robot[i] <= step)//当这个机器人处于已扫过面积里
            {
                                //我疑惑的是为什么要-1
                step = robot[i] + val-1;//更新扫过面积
            }
            else//当这个机器人处于已扫过面积外
            {
                step += val;
            }
        }
        else//当机器人所扫半径不能与已扫的区域街上
            return false;
    }
    return step >= n;//必须当扫过面积大于办公室长度时才能返回真
}
int main()
{
    cin >> n >> k;
    for (int i = 0; i < k; i++)
    {
        cin >> robot[i];
    }
    sort(robot, robot + k);
    int left = 0, right = n, mid,ans=0;
    while (left <= right)
    {
        mid = (right + left) / 2;
        if (check(mid))
        {
            ans = mid;
            right = mid - 1;//收缩最短长度
        }
        else
        {
            left = mid + 1;
        }
    }
    cout << (ans-1) * 2;
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-10 08:26
    关注

    【以下回答由 GPT 生成】

    是的, 我的问题是关于扫地机器人算法中的一个数学逻辑问题。我需要关于这段代码中"step = robot[i] + val-1"的逻辑的更多解释。

    在这段代码中,"step = robot[i] + val-1" 是为了计算机器人运动的步数。具体来说,"robot[i]" 表示机器人当前所在的位置,"val" 表示机器人移动的距离。在这个问题中,机器人在每个位置都需要转向,并继续移动直到到达目标位置。因此,我们需要考虑这个转向过程所花费的额外步数。

    假设机器人在当前位置,经过一次转向之后,可以继续向前移动的步数为 "val"。这意味着机器人需要先转向,然后再向前移动 "val" 步。由于机器人在当前位置转向之后,会朝着初始方向前进 "val - 1" 步,因此需要在原来计算的步数基础上加上 "val - 1" 来得到实际的步数。

    下面是一个示例展示了如何计算机器人的步数:

    robot = [1, 2, 3, 4, 5]  # 机器人的位置
    val = 3  # 移动的距离
    
    for i in range(len(robot)):
        step = robot[i] + val - 1
        print("机器人在位置{}移动{}步后,到达位置{}".format(robot[i], val, step))
    

    输出结果为:

    机器人在位置1移动3步后,到达位置3
    机器人在位置2移动3步后,到达位置4
    机器人在位置3移动3步后,到达位置5
    机器人在位置4移动3步后,到达位置6
    机器人在位置5移动3步后,到达位置7
    

    希望这个解释能够帮助你理解这段代码的逻辑。如果有任何进一步的问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 已采纳回答 1月10日
  • 创建了问题 1月9日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错