题目大意
给出一个长度为L的路,现在已经有n个路障,问还可以最多添加k个路障,使得路障间的最大相隔距离最小。
输入#1
101 2 1
0 101
输出#1
51
————————————————————————————————————————————
#include<bits/stdc++.h>
using namespace std;
int l,n,k,a[100005];
bool check(int x){
int sum=0;//记录路障个数
for(int i=0;i<=n;i++){
if(a[i+1]-a[i]>x){//判断两个路障之间的间距是否大于x
sum+=(a[i+1]-a[i])/x;//增加一个路障
if((a[i+1]-a[i])%x==0){
sum--;
}
}
if(sum>k){//判断需要的路标数是否大与给的路标数
return false;
}
}
return true;
}
int main(){
cin>>l>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int L=0;R=10000005;
a[0]=0;//初始化
a[n+1]=l;
int ans;
while(L<R){
int mid=(L+R)/2;//最大间距
if(check(mid)){//第13行
R=mid;//缩小距离
}else{
L=mid+1;//扩大距离
}
}//正常二分
cout<<L;
return 0;
}
算法:二分