二分枚举时间。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
int n, m;
int a[N];
bool check(int x){
int l = 0;
for(int i = 0; i < m; i++){
if(a[i] - x <= l){/*当前机器人扫描的最左范围小于等于上一个机器人的左右范围,因此能够不重不漏的扫当前 区间*/
if(a[i] <= l) l = a[i] + x - 1;
else l += x;//
}else return false;//当前机器人扫的最左边都无法达到上一个机器人扫的最右边,二者中间有不能够扫的格子
}
if(l >= n) return true;//扫完了n个格子
else return false;
}
int main(){
cin >> n >> m;
for(int i = 0; i < m; i++) cin >> a[i];
sort(a, a + m);
int l = 0, r = n, mid= 0;
while(l < r){
mid = (l + r) >> 1;
if(check(mid)){//时间等于mid时全部扫了每一个格子,r = mid,在[l, r]内寻找更小的时间
r = mid;
}
else l = mid + 1;/*时间等于mid时没有扫完每一个格子,l = mid + 1,在[l, r]内寻找更大的时间来满足扫完每一个格子*/
}
cout << 2 * (l - 1) << endl;
return 0;
}