P3853 [TJOI2007]路标设置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#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;
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;
}
P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
using namespace std;
int main()
{
int l,n,m,ans;
int ch[50001]={0};//第一个点ch[0]==0;
cin>>l>>n>>m;
for (int i=1;i<=n;i++){
cin>>ch[i];
}
int left=0,right=l;//最小和最大;
while (left<=right){
int mid=(left+right)/2;
int now=0,s=0;
for (int i=1;i<=n;i++){
if (ch[i]-ch[now]<mid) s++;//去掉石头
else now=i;//跳一步
}
if (s<=m){
ans=mid;
left=mid+1;
}
else right=mid-1;
}
cout<<ans;
return 0;
}