整数二分题目:
给定一个按照升序排列的长度为n的整数数组,以及 q个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。
如果数组中不存在该元素,则返回“-1 -1”。
输入格式
第一行包含整数n和q,表示数组长度和询问个数。
第二行包含n个整数(均在1~10000范围内),表示完整数组。
接下来q行,每行包含一个整数k,表示一个询问元素。
输出格式
共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回“-1 -1”。
数据范围
1 ≤ n ≤ 100000
1 ≤ q ≤ 10000
1 ≤ 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 N = 1e6 + 10;
int n, q;
int arr[N];
int lower(int l, int r, int x)
{
while (l < r) {
int mid = (l + r) >> 1; //这里使用了右移运算符 相当于除2
if (arr[mid] >= x) {
r = mid;
}
else {
l = mid + 1;
}
}
return l; //这里返回l,r都是一样的,因为循环条件结束是l==r
}
int upper(int l, int r, int x)
{
while (l < r) {
int mid = (l + r + 1) >> 1; //当l=mid时,mid的分子要+1
if (arr[mid] <= x)
{
l = mid;
}
else {
r = mid - 1;
}
}
return r;
}
int main()
{
cin >> n >> q;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
while (q--)
{
int x;
cin >> x;
int l = lower(0, n, x);
if (arr[l] != x) { //先判断给定的数组中有没有x
cout << "-1 -1" << endl;
}
else {
cout << l << endl;
int r = upper(0, n, x);
cout << r << endl;
}
cout << endl;
}
return 0;
}
浮点数二分题目:
给定一个浮点数 n,求它的三次方根。
输入格式
共一行,包含一个浮点数 n 。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留 6 位小数。
数据范围
− 10000 ≤ n ≤ 10000
样例输入:
1000.00
样例输出:
10.000000
这个相比整数二分简单些(整数二分之前有间隙,要考虑+1,-1的问题,但浮点型不要)
#include<iostream> #include<iomanip> using namespace std; int main() { double x; cin >> x; double l = 0; double r = x; while (r - l > 1e-8) { double mid = (l + r)/2; if (mid * mid * mid>= x) { r = mid; } else { l = mid; } } cout << fixed << setprecision(6) << l << endl; return 0; }
还有一个小点,C++输出浮点数后几位需要用cout<<fixed<<setprecision();头文件是#include<iomanip>
马上又是周末了,这周打了一周的王者(关键还是原地打转转),代码没怎么敲。
昨天也不知道咋,在码云提交代码没成功(头一次) .
马上连续一个月竟然断了
这个周末一定要把图给解决了 ~。~