二分的一道题
思路
如果这两块石头之间距离大于等于 Mid,那么可以跳过(跳跃距离满足条件).
否则,我们应该移走第 i 块石头,使得两块石头之间距离大于等于 Mid.
最后,我们看移走的石头个数是否小于等于 M 即可.
AC代码
#include<bits/stdc++.h> using namespace std; long long L,N,M,d[50005],ans; bool check(long long mid){ int temp=0,now=0; for(int i=1;i<=N;i++) if(d[i]-d[now]<mid) temp++;//移走这块石头 else now=i;//不移走 if(temp>M) return false; return true;//能更新答案 } int main(){ cin>>L>>N>>M;//读入 for(int i=1;i<=N;i++) cin>>d[i]; int l=0,r=L;//二分 while(l<=r){ long long mid=(l+r)>>1; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } cout<<ans<<endl;//输出 return 0; }