二分答案例题

1.奇怪的函数
https://www.luogu.com.cn/problem/P2759
这道题好像没有什么方法可以巧妙地解决问题,所以想到枚举答案。
但面临枚举会想到二分答案(更快),判断:
1.二分性:找到一个答案,如果小了,没达到,就往后找,如果大了,已达到,就往前找。直到找到最优答案
2.如何判断:
首先要知道:
在这里插入图片描述
所以判断数位就可以转为判断x*log10(x)>=(n-1)
代码
注意点:
1.边界:从1到答案可能出现的最大值即(2e9)
2。二分不能l=r,因为当l=r,mid=l=r,所以就会是死循环

const int N=2e9;
#define ll long long
ll search(int el,int er){
	ll l=el,r=er,mid=0,jud=0;
	while(l<r){
		mid=(l+r)>>1;
		jud=(mid*log10(1.0*mid));
		if(n-1>jud){
			l=mid+1;
		}else{
			r=mid;
		}
	}
	return l;
}
int main(){
	scanf("%ld",&n);
	ll ans=search(1,N);
	printf("%ld",ans);
	return 0;
}

启示:出现死循环就找找是不是哪个等于出现问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值