https://www.luogu.org/problemnew/show/P3853
1.用二分法慢慢寻找最小的“空旷指数”,假设目前的mid是一个最小的“空旷指数”,那么在a数组(路标数组)里每两个相邻间的路标距离一定要小于等于目前的mid, 如果大于,那就必须使用一些路标去填补这个距离。
2.那么怎么去补呢?由于目前mid已是最大距离,填补时两路标距离一定<=mid,那么当然用mid啦!只要用这个距离÷mid就可以得到所需的路标啦(如果除的通必须减一哦,正确率的教训QWQ)。
3.如果所用路标总数大于你所拥有的路标,这个mid就不合格,这时就要增大mid满足条件。如果小于等于,那么就合格,这时就要降低mid的大小来寻找最小值。
#include<bits/stdc++.h>
using namespace std;
int l,n,k;
int a[100005];
int L,R;
bool check(int dis){//判断mid是否满足条件的函数~~~
int cnt=0;//记录所用路标的个数
for(int i=0;i<=n;i++){
if(a[i+1]-a[i]>dis){
cnt+=(a[i+1]-a[i])/dis;
if((a[i+1]-a[i])%dis==0)
cnt--;
}
if(cnt>k) return false;//不满足条件
}
return true;//满足条件
}
int main(){
scanf("%d%d%d",&l,&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
L=0;R=10000005;//表示懒得动脑qwq
a[0]=0;//注意题目的坑点,前后都不能丢
a[n+1]=l;
int ans;
while(L<R){
int mid=(L+R)/2;
if(check(mid)) R=mid;
else L=mid+1;
}
cout<<L;
}