算法笔记-二分查找和二分答案

自己的二分查找板子
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;
}

猜你喜欢

转载自blog.csdn.net/Raki_J/article/details/105742373