从今天开始写博客。这是上传的第一个题。
这个题是一个利用二分查找答案的题,之前一直单纯把二分用于查找一个线性函数的值,现在学会了利用二分加上一个判断函数来对答案进行查找。
之后。如何找到最短跳跃距离。假设这个答案为x。那我随机移走n块石头,只要是大于小于这个答案的都应该拿走。那么在判断函数中,如果石头数大于m,那么这个就不成立。假设的x就应该进一步提升,到刚好有m个石头满足这个距离时成立。
#include<bits/stdc++.h>
using namespace std;
int n,m,L;
int a[50010];
bool solve(int x)
{
int ans=0,cnt=0;
for(int i=0;i<=n;i++)
{
if(a[i]-ans<x){cnt++;}
else{ans=a[i];}
}
if(cnt>m){return 0;}
else{return 1;}
}
int main()
{
cin>>L>>n>>m;
for(int i=0;i<n;i++){cin>>a[i];}
a[n]=L;
int l=1,r=L;
while(l<r)
{
int mid=(l+r+1)/2;
if(solve(mid)){l=mid;}
else{r=mid-1;}
}
cout<<l;
return 0;
}