为什么会使用二分?
当对解空间中 包含一种所谓“单调性”关系时才可以使用二分。
而这道题里的解空间就是空旷指数的取值。其中越大的空旷指数只需要越少的路标,若一个空旷指数满足题意,那么比这个空旷指数更大的数也一定可以满足题意,只需要搜索比它更小的解。因此可以使用二分。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 100010;
int A[MAXN];
int L, N, K;
bool check(int len)
{
if (len <= 0)
return false;
int res = K;
int start = A[0];
for (int i = 0; i < N - 1; i++)
{
int tmp = res;
while (A[i + 1] - start > len)
{
res--;
start += len; //这样才是正确的 让每一次start都需要更新 之前以为 写成if 然后里面是 res -= (A[i + 1] - start) / len效率更高
//事实上这种写法相当于不会在计算过程中更新start 因此两种写法并不等价
}
start = A[i + 1];
if (res < 0)
return false;
}
return true;
}
int main()
{
cin >> L >> N >> K;
int l = 0, r = 0, mid;
for (int i = 0; i < N; i++)
{
cin >> A[i];
r = max(r, A[i]);
}
while (l < r)
{
mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << l;
}