二分或二分答案

//二分答案是最容易写挂的
1.while(l<r) 一定是< 且在l==r时退出循环
2.如下pd(mid)的mid可以作为答案时,l=mid或r=mid
  不能作为答案干脆在+1/-1,因为r/l已经不可能是答案了
3.如果答案要求尽量小,为第一种,尽量大,为第二种

//单调递增序列a中查找>=x的数中最小的一个(即x或x的后继) 

while(l<r)
{
  int mid=(l+r)/2;
  if(a[mid]>=x)   //if(pd(mid)>=x)(二分答案时)                         
  	r=mid;                                   
  else
	l=mid-1;
}
return a[l];

//单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱) 
while(l<r)
{
  int mid=(l+r+1)/2;  //如果是(l+r)/2 可能l=4,r=5,mid=4,下一轮依然不变
  if(a[mid]<=x)  //if(pd(mid)<=x)(二分答案时)    
  	l=mid;
  else
	r=mid+1;
}
return a[l];

//实数域上的二分 
while(l+1e-5<r)
{
  double mid=(l+r)/2;
  if(calc(mid))
  	r=mid;
  else
	l=mid;
}

//实数:二分100次 
for(int i=0;i<100;i++)
{
	double mid=(l+r)/2;
    if(calc(mid))
  		r=mid;
    else
		l=mid;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值