题目链接:http://oj.ecustacm.cn/problem.php?id=1474
题目的要求是花费时间最少,那么只要所有机器人花费的时间相同就可以,即每个机器人清扫的范围相同即可。
则搜索空间就变为了清扫范围,1-N。二分搜索清扫范围即可,只要方案可行就记录
具体见代码注释:
#include<bits/stdc++.h>
using namespace std;
int robot[1000005];
int n, k;
bool check(int len)
{
//cout<<"len: "<<len<<endl;
int sweep=0; //sweep代表清扫到了哪个位置
for(int i=1; i<=k; i++)
{
if(robot[i]-len<=sweep) //如果当前机器人只扫左侧,能够覆盖左侧未清扫的位置,则可进行当前机器人的清扫
{
if(robot[i]<=sweep)//如果当前机器人已经处于清扫过的位置,则当前机器人只扫右侧区域
sweep=robot[i]+len-1;
else//否则从上一个清扫到的位置继续
sweep+=len;
}
else //当前机器人只扫左侧,不能覆盖左侧未清扫的位置,当前方案不可行,返回
return 0;
//cout<<sweep<<endl;
}
return sweep>=n; //表示当前方案可行
}
int main()
{
while(cin>>n>>k)
{
for(int i=1; i<=k; i++)
{
cin>>robot[i];
}
sort(robot+1, robot+k+1);
int L=0, R=n, M, ans;
while(L<=R)
{
M=(L+R)/2;
if(check(M))
{
R=M-1;
ans=M;
}
else
L=M+1;
}
cout<<(ans-1)*2<<endl;
}
return 0;
}