测试样例:
25 5 2
2
11
14
17
21
样例输出:
4
代码:
#include<iostream>
using namespace std;
typedef long long ll;
const ll inf = 1e6 + 5;
const int N = 1e6 + 5;
ll stok[N];
ll l, n, k;
bool check(ll x)
{
ll tot = 0, now = 0;
for (int i = 1; i <= n; i++)
{
if (stok[i] - stok[now] < x) // 距离小于待尝试距离,需要挪动石头
tot++;
else // 否则直接跳
now = i;
}
return tot <= k;
}
int main()
{
cin >> l >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> stok[i];
}
ll L = 1, R = l, ans = 0;
while (L <= R)
{
ll mid = L + (R - L) / 2;
if (check(mid)) { // 最小距离尽可能大
ans = mid;
L = mid + 1;
}
else {
R = mid - 1;
}
}
cout <<ans;
return 0;
}