题解
2023-09-29 18:14:30
发布于:安徽
12阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
long long len,n,m;
long long a[50005],b[50005];
long long mina=INT_MAX;
bool check(long long mid){
int cnt=0;//统计至少会搬走的石块数
int i=0,now=0;
//now 用来统计当前最后没有被移走的石块的位置
while(i<n+1){
i++;
if(a[i]-a[now]<mid)
cnt++;
//若两石块之间的距离小于目前二分到的可以的最大距离
//(即需要挪走的石块) , cnt 累加 1
else
now=i; //否则 , 更新 now 的位置
}
if(cnt<=m) return true; //若在允许范围内 return true
else return false; //否则 return false
}
int main(){
cin>>len>>n>>m;
//输入
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]-a[i-1]<mina) mina=a[i]-a[i-1];
}//求给定的每个石块之间的最短距离
a[0]=0;//河岸的一边(出发点) :距离 0
a[n+1]=len;//河岸的另一边(终点) :距离 len
if(n==0){
cout<<len;return 0;
} //特判:若没有河两岸之间没有一个石块,则最短
//跳跃距离的最大值就是len
long long l=mina,r=len; //优化
//二分的左指针(最短距离[mina])
//二分的右指针(最长距离[len])
while(l<r) {
int mid=(l+r+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
//经典二分模板
cout<<l;
//输出左边界
return 0;
}
这里空空如也
有帮助,赞一个