正经题解|数的位置
2026-04-12 20:18:03
发布于:河北
9阅读
0回复
0点赞
废话少说,上代码
// 引入标准输入输出流库,用于控制台输入输出
#include<iostream>
// 引入向量容器库,用于动态数组存储
#include<vector>
// 使用标准命名空间,避免重复书写std::前缀
using namespace std;
int main() {
// 关闭C和C++标准流的同步,加速cin/cout的输入输出速度
ios::sync_with_stdio(false);
// 解除cin与cout的绑定,避免每次cin操作后自动刷新cout缓冲区
cin.tie(nullptr);
// 解除cout与任何输出流的绑定,进一步优化输出性能
cout.tie(nullptr);
// 定义变量:n表示数组元素个数,m表示查询次数
int n=0,m=0;
// 从输入读取数组长度n和查询次数m
cin>>n>>m;
// 创建一个大小为n+1的向量(下标从1开始,符合题目输入习惯)
vector<int> a(n+1);
// 循环读取n个元素,存入向量的1~n位置
for(int i=1;i<=n;++i) cin>>a[i];
// 执行m次查询操作
while(m--){
// 定义变量:x为要查询的目标值,ans为查询结果(初始化为-1表示未找到)
int x=0,ans=-1;
// 二分查找的左右边界:左边界l初始为1,右边界r初始为n
int l=1,r=n;
// 读取当前要查询的目标值x
cin>>x;
// 二分查找核心循环:当左边界不超过右边界时继续查找
while(r>=l){
// 计算中间位置mid,避免溢出的写法应为l + (r-l)/2,这里因数据范围小简化处理
int mid=(l+r)/2;
if(a[mid]>x){
// 中间值大于目标值,说明目标在左半区间,调整右边界
r=mid-1;
}else if(a[mid]==x){
// 找到目标值,记录其位置mid到ans,并跳出查找循环
ans=mid;
break;
}else{
// 中间值小于目标值,说明目标在右半区间,调整左边界
l=mid+1;
}
}
// 输出当前查询的结果:找到则输出下标,未找到则输出-1
cout<<ans<<"\n";
}
// 程序正常结束,返回0
return 0;
}
这里空空如也








有帮助,赞一个