二分查找
纯在了很久的问题了,一直有一点弄不明白。现在应该搞懂了。
主要是查找我们说要的值在那个位置上
代码:
int l=上届,r=下届; while(l<=r) { int mid=(l+r)>>1; if(a[mid](这个位置上的值大小号数什么的)<目标的值大小号数什么的) l=mid+1; else r=mid-1; }
应为是< 所以 l 这个位置 所代表的值一定(有解就==)没有接就是 >一个 记住了
来个例题:
题目:

问题 A: 斐波那契数列 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: 4 [提交] [状态] [讨论版] [命题人:xingxing] 题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。 小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代。如果某两对兔子是同时出生的,那么小 C 会将父母标号更小的一对优先标 号。 如果我们把这种关系用图画下来,前六个月大概就是这样的: 其中,一个箭头 输入 输入第一行,包含一个正整数 输出 输入一共 样例输入 Copy 5 1 1 2 3 5 7 7 13 4 12 样例输出 Copy 1 1 2 2 4
代码:

#include <bits/stdc++.h> using namespace std; #define ri register int long long a[100]; int T; int main(){ scanf("%d",&T); a[0]=a[1]=1; for(ri i=2;i<=61;i++) a[i]=a[i-1]+a[i-2]; while(T--) { long long x,y; scanf("%lld%lld",&x,&y); while(x!=y) { if(x>y) swap(x,y); int l=1,r=61; while(l<=r) { int mid=(l+r)>>1; if(a[mid]<y) l=mid+1; else r=mid-1; } y-=a[l-1]; } printf("%lld\n",x); } }
1