题目描述:
解题思路:
注意点:二分需要一些冗余,即遍历的r大小可能比需要建立的数组大。
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + 9;
using ll = long long;
int L, n, m;
int a[N];
int check(int mid)
{
int res = 0, lst = 0;//lst表示i的上一个
for(int i = 1; i <= n; i++)
{
if(a[i] - a[lst] < mid)
{
res++;
continue;
}
lst = i;
}
if(L - a[lst] < mid)return m + 1;
//判断是否合法(L为最后一个元素,不搬走;输出m+1即表示不合法)
return res;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> L >> n >> m;
for(int i = 1; i <= n; i++)cin >> a[i];a
ll l = 0, r = 1e9 + 10;//二分r需要一些冗余,毕竟r超过与数据并不影响(一般二分需要开ll)
while(l + 1 != r)
{
int mid = (l + r) / 2;
if(check(mid) <= m)l = mid;//check与mid正相关, 所以<=时求的是最后一个m位置l
else r = mid;
}
cout << l;
return 0;
}