我的疑点是“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;
}