关于本题二分的神奇问题
查看原帖
关于本题二分的神奇问题
421421
Rem_CandleFire楼主2023/8/31 14:04

大致思路:通过找规律发现最终的状态具有斐波那契数列的性质,差分处理答案

AC代码的问题部分:

#include<bits/stdc++.h>
using namespace std;
long long fib[105],n,l,r,ans;
string nouse;
int erfen(long long x)
{
	int l=1,r=92;
	while(l<r)
	{
		int mid=(l+r+1)>>1;
		if(fib[mid]>x)r=mid-1;
		else l=mid;
	}
	return l;
}

这样子的二分可以找到最大的小于等于x的斐波那契数的位置

可是,当二分代码写成这样时,就会全WA(代码其他部分完全一致)

int erfen(long long x)
{
	int l=1,r=92,mid=0;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if(fib[mid]==x)break;
		if(fib[mid]>x)r=mid-1;
		else l=mid+1;
	}
	return mid;
}

敢问有没有dalao解释一下这两种二分写法的区别或者在保持while循环条件为 l<=rl<=r 的前提下可行的修改方法?玄关1

警示后人:不能使用lower_bound函数(当然可能是我菜)

2023/8/31 14:04
加载中...