二分边界

本文总结了二分查找算法在不同场景下的应用技巧,包括最大值、最小值问题的求解,以及各种边界条件下的处理方式。通过具体的伪代码示例,帮助读者理解并掌握二分查找的核心思想。

最大值

 while l<=r do 左开右开

 mid:=(l+r) div 2;

if ok then l:=mid+1 ans:=mid

else r:=mid-1

ans:=r;

 

inc(r) X

while l<r do 左闭右开

mid:=(l+r) div 2

if ok then l:=mid

else r:=mid

ans:=l

 

inc(r)左开右开

while l<r do

mid:=(l+r) div 2

if ok then l:=mid+1//ans:=mid

else r:=mid

ans:=l-1 or r-1 //ans

 

while l<r do 左闭右不确定 直到左右相等

mid:=(l+r+1) div 2

if ok then l:=mid

else r:=mid-1

l r

最小

while l<r do 左不确定右闭

mid:=(l+r) div 2

if ok then r:=mid

else l:=mid+1

l r

  while(l<=r){
    	int mid=l+r>>1;
    	for(i=f=1;i<=n && f<=m;i++,f++) while(f<=m && abs(a[i]-b[f])+abs(b[f])>mid) f++;
    	if(i==n+1 && f<=m+1) ans=mid,r=mid-1;
    	else l=mid+1;
ans l

while (l<r) do begin
m:=(l+r) div 2;
s:=a[0]; u:=0;
for i:=1 to n do
if (a[i]-s>=m) then s:=a[i] else inc(u);
if (u>p) then r:=m-1 else begin l:=m+1;ans:=m;end;
end;

 

 

repeat mid:=(l+r) div 2;s:=0;f:=0; for i:=l to mid do begin inc(sum[b[i].s],b[i].d);dec(sum[b[i].t+1],b[i].d); end; for i:=1 to n do begin inc(s,sum[i]); if s>rr[i] then begin f:=-1;break;end; end; if f=-1 then begin r:=mid; for i:=l to mid do begin dec(sum[b[i].s],b[i].d);inc(sum[b[i].t+1],b[i].d); end; end else l:=mid+1; until l=r; if l=m+1 then writeln(0) else begin writeln(-1); writeln(l); end;

转载于:https://www.cnblogs.com/wyh447154317/p/8684643.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值