目录
l+r+1>>1求最大值
l+r>>1求最小值
一、789 数的范围
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。
如果数组中不存在该元素,则返回
-1 -1
。输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。
第二行包含 n 个整数(均在 1∼10000范围内),表示完整数组。
接下来 q 行,每行包含一个整数 k,表示一个询问元素。
输出格式
共 qq 行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回
-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 = 100010;
int q[N];
int n,m;
int main()
{
cin >> n >> m;
for(int i=0;i<n;i++) cin >> q[i];
while(m--)
{
int x;
cin >> x;
//找数组起始位置
int l=0,r=n-1;
while(l<r) //结束后l=r 后边写l还是r都可以
{
int mid = l+r >> 1;
if(q[mid] >= x) r = mid;
else l = mid + 1;
}
if(q[l]!=x) cout << "-1 -1" << endl;
else
{
cout << l << ' ';
//找数组终止位置
int l=0,r=n-1;
while(l<r)
{
int mid = l+r+1 >> 1;
if(q[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}
return 0;
}
二、790 数的三次方根
给定一个浮点数 n,求它的三次方根。
输入格式
共一行,包含一个浮点数 n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留 6 位小数。
数据范围
−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000
#include <iostream>
using namespace std;
int main()
{
double n;
cin >> n;
double l=-10000,r=10000;
while(r-l > 1e-8) //数比要保留的小数多两位
{
double mid = (l+r)/2;
if(mid*mid*mid >= n) r = mid;
else l = mid;
}
printf("%.6f",l);
}
三、4423 最近距离
给定一个长度为 n 的整数数组 a1,a2,…,an。
对于每个整数 i(1≤i≤n),请你找到一个整数 j,要求:
- 1≤j≤n
- aj=0
- 在满足以上两个条件的情况下,|i−j| 应尽可能小。|i−j| 的最小可能值不妨用 bi 来表示。
请你计算并输出 b1,b2,…,bn。
保证给定数组中一定存在 0。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
一行,n 个整数 b1,b2,…,bn。
数据范围
前 4 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×10^5,−10^9≤ai≤109。输入样例1:
9 2 1 0 3 0 0 3 2 4
输出样例1:
2 1 0 1 0 0 1 2 3
输入样例2:
5 0 1 2 3 4
输出样例2:
0 1 2 3 4
输入样例3:
7 5 6 0 1 -2 3 4
输出样例3:
2 1 0 1 2 3 4
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int>v;
vector<int>zero;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
v.push_back(x);
if(!x) zero.push_back(i);
}
for(int i=0;i<n;i++)
{
if(v[i]==0)cout<<0<<' ';
else
{
//找≥该点的第一个0的位置
int l=0,r=zero.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(zero[mid]>=i)r=mid;
else l=mid+1;
}
int a=zero[l];
//找≤该点的最后一个0的位置
l=0,r=zero.size()-1;
while(l<r)
{
int mid=l+r+1>>1;
if(zero[mid]<=i)l=mid;
else r=mid-1;
}
int b=zero[l];
cout<<min(abs(a-i),abs(b-i))<<' ';
}
}
return 0;
}