二分查找-模板
二分要注意边界
有单调性的题目一定可以用二分,但没有的话也可能可以用二分
二分的L,R端点取在哪里在于答案是否包含mid
①中,答案在绿色线中,②中,答案在红色线中,注意,红绿色线不一定是紧挨的,他们只是情况是否满足而是
为什么mid要+1取?如果l=r-1,即r=l+1
那么mid会变成(2l+1) / 2=l,如果此时check恰好为true,那么会陷入死循环
所以分析问题可以先考虑答案在哪个区间,再接着考虑调整左右端点
方法1-推荐/常用
1 2 3 4 5 6 7 8 9 10 11 | l , r while (l <= r) { m = (l + r) / 2; if (check()) { ans = m; l = m + 1; } else r = m - 1; } |
方法2
1 2 3 4 5 6 7 8 9 10 11 | l , r while (l < r) { m = (l + r) / 2; //左 if (check()) { ans = m; r = m; } else l = m + 1; } |
方法3
1 2 3 4 5 6 7 8 9 10 11 | l , r while (l < r) { m = (l + r) / 2 + 1; //右 if (check()) { ans = m; l = m; } else r = m - 1; } |
二分查找的模板 https://www.luogu.com.cn/problem/P8814 基于此题而写 此题答案(用到二分):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <bits/stdc++.h> #define int long long using namespace std; int k, n, d, e; signed main() { scanf ( "%lld" , &k); while (k--) { scanf ( "%lld%lld%lld" , &n, &d, &e); int x=n+2-d*e; //p+q int L=1, R=(x>>1), mid=0, ans=0, q=0; while (L<=R) { mid=((L+R)>>1); //p q=x-mid; if (q*mid<=n) { ans=mid; L=mid+1; } else R=mid-1; } if (ans*(x-ans)==n) printf ( "%lld %lld\n" , ans, x-ans); else printf ( "NO\n" ); } return 0; } /* 题 qd=n (q-1)(d-1)+1=de n d e 770 5 77 q d 2 385 1 770 5 77 2 385 d e 393 3 32*39=1248 n d e 1248 393 3 q d 32 39 34 35 析 n+2-de=q+d 770+2-385=q+d (387) <----- (q-1)(d-1)=de-1 (q-1)(d-1)=384 q d 2 385 3 384 . ... . ... . ... 193 194 (n+2-d*e)/2 至 (770+2-385)-((n+2-d*e)/2) */ |
浮点数二分:例子,求开平方根,sqrt(x)
少了麻烦的边界条件,直接赋值即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <bits/stdc++.h> using namespace std; double x, L, R; int main() { scanf ( "%lf" , &x); L=0, R=x; while (R-L>1e-8) //精度相差极小,即可退出 可以换成 for (int i=1; i<=100; i++),推荐while { double mid=(L+R)/2; if (mid*mid>=x) R=mid; else L=mid; } printf ( "%.5lf" , L); return 0; } |
__EOF__

本文作者:cnsdsg886-帥
本文链接:https://www.cnblogs.com/didiao233/p/17794833.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/didiao233/p/17794833.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?