自己的二分查找板子
judge函数是关键
while(l<=r){
mid=(l+r)>>1;
if(judge(mid))l=mid+1;
else r=mid-1;
}
cout<<l-1;
lower_bound和upper_bound
lower_bound
ans=(a.begin(), a.end(), x );
求得第一个大于等于x的值的地址
所以求位置时要 -a;
ans=lower_bound(a+1,a+1+n,x)-a;
ub求第一个大于x的值的地址;
luogu p2678 跳石头
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000005];
int n,c,ans,x,s,t;
int l,r,mid;
bool judge(int x){
int sum=0;
int num=0;
for(int i=1;i<=c;i++){
if(a[i]-num<x){//**这里的num是关键,如果这个石头要选择被移开才更新num**
sum++;
}
else num=a[i];
}
if(sum<=t)return true;
return false;
}
signed main(){
cin>>n>>c>>t;
for(int i=1;i<=c;i++){
scanf("%d",&a[i]);
}
r=n;
l=0;
while(l<=r){
mid=(l+r)>>1;
if(judge(mid))l=mid+1;
else r=mid-1;
}
cout<<l-1;
return 0;
}