二分(C++)——789、790
二、二分
2.1整数二分(789、790)
true [mid,r] l=mid
1. mid=(1+l+r)/2
false [l,mid-1] r=mid-1
true [l,mid] r=mid
2. mid=(l+lir)/2
false [mid+1,r] l=mid+1
模板1
int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid; // check()判断mid是否满足性质else l = mid + 1;}return l;
}
模板2
int bsearch_2(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}
2.2浮点二分(791、792、793、794)
模板:
double bsearch_3(double l, double r)
{const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求while (r - l > eps){double mid = (l + r) / 2;if (check(mid)) r = mid;else l = mid;}return l;
}
自我理解:
其中check(mid)其实就是mid所不满足的条件,一例题790为例,要查找满足mid*mid*mid=n,那在括号里所填写的就是n不满足的条件mid*mid*mid<n,那么最终查找的就是满足条件的数字
例题789
题目:
给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。
对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。
如果数组中不存在该元素,则返回“-1 -1”。
输入格式
第一行包含整数n和q,表示数组长度和询问个数。
第二行包含n个整数(均在1~10000范围内),表示完整数组。
接下来q行,每行包含一个整数k,表示一个询问元素。
输出格式
共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回“-1 -1”。
数据范围
1≤n≤1000001≤n≤100000
1≤q≤100001≤q≤10000
1≤k≤100001≤k≤10000
输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
答案:
#include <iostream>
using namespace std;
const int maxn = 100005;
int n, q, x, a[maxn];
int main()
{scanf("%d%d", &n, &q);for (int i = 0; i < n; i++) scanf("%d", &a[i]);while (q--) {scanf("%d", &x);int l = 0, r = n - 1;while (l < r){int mid = l + r >> 1;if (a[mid] < x) l = mid + 1;else r = mid;}if (a[l] != x) {printf("-1 -1\n");continue;}int l1 = l, r1 = n;while (l1 + 1 < r1){int mid = l1 + r1 >> 1;if (a[mid] <= x) l1 = mid;else r1 = mid;}printf("%d %d\n", l, l1);}return 0;
}
例题790
题目
给定一个浮点数n,求它的三次方根。
输入格式
共一行,包含一个浮点数n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留6位小数。
数据范围
−10000≤n≤10000−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000
答案
#include<iostream>using namespace std;double n;int main(){cin >> n;double l = -1e4, r = 1e4;while(r - l > 1e-8){double mid = (l + r) / 2;if(mid * mid * mid >= n) r = mid;else l = mid;}printf("%lf", l);return 0;
}
思路:要求找到n的三次方跟,利用二分查找数据,就是要查找mid,使得mid*mid*mid=n,那就利用浮点数的二分查找找到mid,在这里找到mid的性质是mid*mid*mid<n
这个题的关键点就在与要明白是在查找数字,还要明白是在查找哪个数字
注意:
1.在这里所有的数都是浮点数,在表示1/2是直接除以2,不能用>>1来表示了
2.倒数第二行输出l是是%lf
3.在模板中不是int型是double,r-l>=1e-8(>1e-8也可以)
4.题目要求是输出保留6位小数
5.double mid的定义必须放在while里定义
二分(C++)——789、790相关推荐
- iOS开发所需英语词汇整理
提示:双击可以打开文本copy 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 ...
- 算法基础(2) | 高精度、前缀和、差分
文章目录 一.高精度 1.1 高精度加法 1.2 高精度减法 1.3 高精度乘法 1.4 高精度除法 二.前缀和 2.1 一维前缀和 2.2 二前缀和 三.差分 3.1 一维差分 3.2 二维差分 四 ...
- 力扣刷题记录---二分法
一般的二分查找应用的地方都是在一个单调有序序列里面进行值的搜索,,用中间点进行区域划分,当中间值大于目标值target,说明目标值在左区域,反之则在右区域.这样不断缩小区域,每次搜索区域都只要当前范围 ...
- 算法基础课-基础算法
第一讲 基础算法 快速排序 归并排序 二分 整数二分模板 AcWing 789. 数的范围(整数二分法) AcWing 1236.递增三元组 AcWing 730. 机器人跳跃问题 AcWing 12 ...
- 分享下我的博客园CSS
今天没事瞎折腾博客园,对于HTML,css,js等都是了解一点点. 我用的模板是: 修改后的样式为: \ css代码如下: 1 /* Minification failed. Returning un ...
- 很强的PHP图片处理类
/** * 基本图片处理,用于完成图片缩入,水印添加 * 当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小 * 水印图可以设置跟背景的合并度 * * Copyright(c) 2005 by ...
- linux 内核 虚拟文件系统VFS 路径查找 path_lookup
路径查找是VFS的一个主要操作:给定一个文件名,获取该文件名的inode.路径查找是VFS中相当繁琐的一部分,主要是符号链接,文件系统装载点,以及. ..和//等奇怪路径 引入了复杂性. nameid ...
- 暑期项目经验(十)--struts + poi
struts + poi 一.poi知识讲解 可以下载 孔浩老师 的poi视频,其中封装的四个工具类,很好用,能方便应用到项目中. 二.poi实例 1.引入jar包 2. 引入四个工具类 1 pack ...
- 九度OJ 区间问题
题目描述: 给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k. 输入: 输入包含多组测试用例,每组测试用例由一个整数n(1<=n<=10000)开头,代表数组的大小. ...
- 详解Linux2.6内核中基于platform机制的驱动模型 (经典)
[摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...
最新文章
- CVPR 2020 oral 首次提出VPSnet用于分割界新问题-视频全景分割
- python函数能否增强代码可读性_总结的几个Python函数方法设计原则
- Summary of the Academic English Class
- 淘宝架构师为你揭秘2017双十一分布式缓存服务Tair
- php str_replace 字符串替换
- 关于小程序的一些坑的总结
- mysql查看binlog日志内容
- eclipse一些实用小技巧
- CCNA学习指南 TCP/IP
- 如何用O2OA公文编辑器制作标准的红头文件?
- html内容转换中文乱码怎么办,HTML中文乱码怎么解决?
- 如何配置ASP运行环境
- 解决:java.net.SocketException: Software caused connection abort: recv failed
- 【MATLAB】MATLAB矩阵的表示
- Google Voice、Voice Search 安装
- 给定字符串A和B,输出A和B中的最大公共子串。
- NFC天线匹配调试简介1
- 前端面试题(中高级)
- 【金猿产品展】亿信华辰睿治——VIP策略,打造数据治理最佳实践
- 常见的端口及对其的攻击思路