洛谷p2678跳石头GuanYiQiao2024-11-022024-11-0212345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758//基于二分查找实现 时间复杂度O(log2n)//枚举+检查#include <bits/stdc++.h>using namespace std;int a[50005];int l,n,m;int ans;bool check(int mid){//mid是理想的最短跳跃距离的值 本函数相当于在模拟理想能否实现 实现与否通过返回的结果体现 int i=0,now=0,cnt=0; while(i<n+1) { i++;//先跳出一步 if(a[i]-a[now]<mid){ //搬走石头 cnt++; } else{ now=i;//>=mid 跳过来 } } if(cnt<=m) { return true;//mid小了或者正好 } else{ return false;//mid大了 降低对mid值的期望值 }}int main(){ //答案范围一定在1到L之间是本题突破口 //相较于贪心 枚举+检查更加适合本题 //从1到l枚举理想的最小跳跃值并检验来得出答案 cin>>l>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } a[n+1]=l; a[0]=0; int ll=1,rr=l,mid; while(ll<=rr)//使用二分查找可以更快找到正确的值 { mid=(ll+rr)/2; if(check(mid)) { ll=mid+1; //更新答案值 说明当前的mid是一个合理的值 后面也可能找到更合适的 ans=mid; } else{ rr=mid-1; } } cout<<ans<<endl; return 0;} 本题考察知识:二分查找 [视频内嵌代码]