企业网站的主要类型有,网址提交,山西汽车网站建设,单位网站建设情况二分
模板
整数二分模板
bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用#xff08;即寻找左边界使用#xff09;#xff1a;
int bsearch_1(int l, int r)
{while (l r){int mid l r 1;if (…二分
模板
整数二分模板
bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用即寻找左边界使用
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;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用即寻找右边界使用
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;
}
浮点数二分模板
bool check(double x) {/* ... */} // 检查x是否满足某种性质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;
}
例题一
题目
给定一个按照升序排列的长度为 的整数数组以及 个查询。
对于每个查询返回一个元素 的起始位置和终止位置位置从 0 开始计数。
如果数组中不存在该元素则返回 -1 -1。
输入格式
第一行包含整数 和 表示数组长度和询问个数。
第二行包含 个整数均在 范围内表示完整数组。
接下来 行每行包含一个整数 表示一个询问元素。
输出格式
共 行每行包含两个整数表示所求元素的起始位置和终止位置。
如果数组中不存在该元素则返回 -1 -1。
数据范围 输入样例
6 3
1 2 2 3 3 4
3
4
5
输出样例
3 4
5 5
-1 -1
代码示例
#include iostream
using namespace std;int main() {int n, t;cin n t;int* array new int[n];for (int i 0; i n; i) {cin array[i];}while (t--) {int num;cin num;//寻找左边界int l 0, r n - 1;while (l r) {int mid l r 1;if (array[mid] num) r mid;else l mid 1;}if (array[l] ! num) cout -1 -1 endl;else {cout l;//寻找右边界int l 0, r n - 1;while (l r) {int mid l r 1 1;if (array[mid] num) l mid;else r mid - 1;}cout l endl;} }
}
例题二
题目
给定一个浮点数 求它的三次方根。
输入格式
共一行包含一个浮点数 。
输出格式
共一行包含一个浮点数表示问题的解。
注意结果保留 6 位小数。
数据范围 输入样例
1000.00
输出样例
10.000000
代码示例
#include iostream
#include cmath
#include algorithm
#include iomanip
using namespace std;const double eps 1e-8; // eps 表示精度取决于题目对精度的要求int main() {double n;cin n;double l, r;//注意开根号的范围1是特殊点if (n 1) l 1, r n;else if (n 0) l 0, r 1;else if (n -1) l n, r -1;else l -1, r 0;while (r - l eps){double mid (l r) / 2;if (pow(mid, 3) n) r mid;else l mid;}cout fixed setprecision(6) l endl;return 0;
}