本文主要是介绍信息学奥赛一本通-编程启蒙3465:练83.5 二分查找2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
3465:练83.5 二分查找2
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 377 通过数: 177
【题目描述】
对有序数组进行二分查找,是一种性能卓越的算法:目标是在有序数组a[]
中查找是否有a[k]=key
,若有返回kk,否则返回−1−1。
* 若有多个a[k]=key
,请输出最大的kk。
* 下标kk从11开始计数。
【输入】
第一行包含11个整数NN,代表数组长度。
第二行包含NN个(N≤30000N≤30000)int范围内的整数,保证升序,空格隔开。
第三行包含11个整数TT,代表有TT组询问。
第四行包含TT个(T≤30000T≤30000)int范围内的整数,表示每组询问需要查找的keykey值,空格隔开。
【输出】
一行,对于每组询问输出结果(kk 或 −1−1),空格隔开。
【输入样例】
4
-2 -2 -2 1
3
-2 -2 -1
【输出样例】
3 3 -1
思路:
正常写就好了
【c++】二分查找教程-CSDN博客
代码:
#include<bits/stdc++.h>
using namespace std;long long n,key,mi=0,f=0;long long a[30010];
void cha(long long l,long long r,long long mid){while(l<=r){mid=(l+r)/2;if(a[mid]==key){if(mid>mi){mi=mid;f=1;}l=mid+1;}else if(a[mid]>key){r=mid-1;}else if(a[mid]<key){l=mid+1;}}
}
int main(){ios:: sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;long long l=1,r=n,mid;for(int i=1;i<=n;i++){cin>>a[i];}long long t;cin>>t;for(int i=1;i<=t;i++){cin>>key;l=1;r=n;mi=0;f=0;cha(l,r,mid);if(f==1){cout<<mi<<" ";continue;}cout<<"-1 ";}return 0;
}
这篇关于信息学奥赛一本通-编程启蒙3465:练83.5 二分查找2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!