check函数实质是,验证当前解是否可行
由于解是空旷指数,我们二分空旷指数,看看这个空旷指数我们是否做得到
根据check结果进行二分
贪心:
只有空旷指数大于x才需要操作,放入地标,而且一定放入中间,否则不需要
是倍数时
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1E5 + 5;
int a[N],b[4*N];
int L, n,k;
int MAX = -1; //最大空旷指数
int kong;
int cnt;
struct tree
{
int l, r;
int MAX;
}tr[4*N];
bool check(int x)
{//看看通过插入m个点,能不能把空旷值变为x
//如果能 返回true 不能 返回false
//找到一个空旷指数最大的区间,然后去分割这个区间
int m=0;
for (int i = 0;i < n;i++)
{//插入
if (b[i] > x)
{//如果这个>x,计算把它变成<=x需要几步
m += b[i] / x;
if (b[i] % x == 0) m--; //如果是倍数,例如0~200 变成4个50只要放3个就行了
}
}
return m > k ? false : true;
}
int main()
{
cin >> L >> n >> k;
kong = a[0];b[0] = a[0];
for (int i = 0;i < n;i++)
{
cin >> a[i];
if (i > 0)
{
kong = max(a[i] - a[i - 1], kong);
b[i] = a[i] - a[i - 1];
}
}
int l = 0, r = kong;
cnt = n;
while (l < r)
{//满足条件的第一个元素
int mid = l + r >> 1;
if (check(mid)) //满足条件了
r = mid;
else
l = mid + 1;
}
cout << l;
}