二分模板:
在一个文章里看到的,二分有三种模板:
最好用的:
int erfen(int l, int r)
{
l--,r++;
while (l+1 < r)
{
int mid = l + r >> 1;
if (check(mid)) l = mid;
else r = mid ;
}
return l;
}
跳石头
C-[NOIP2015]跳石头_2021秋季算法入门班第三章习题:二分、三分、01 (nowcoder.com)
思路:
二分
AC代码:
#include <iostream>
using namespace std;
long long arr[50005];
long long L,n,m,num;
bool judge(long long x){
long long p=0;
long long cnt=0;
for(int i=1;i<=n;i++){
if(arr[i]-p>=x) p=arr[i];
else cnt++;
}
return cnt<=m;
}
int main(){
cin>>L>>n>>m;
arr[n+1]=L;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
long long l,mid,r;
l=0;r=L+1;
while(l+1<r){
mid=l+r>>1;
if(judge(mid)==false) r=mid;
else l=mid;
}
cout<<l<<endl;
return 0;
}