大致思路:通过找规律发现最终的状态具有斐波那契数列的性质,差分处理答案
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<=r 的前提下可行的修改方法?玄关1
警示后人:不能使用lower_bound函数(当然可能是我菜)