原题链接:新生的入队仪式
这题还是比较简单的,一开始题没读透出了点小问题,后来经修改就OK了代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[100055];
int main(){
int n,m,p,q,k;
cin>>n>>m;
int max=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(max<a[i]){
max=a[i];
p=i;
}
}
if(m>max){
cout<<p+1;
}else{
cin>>k;
if(k==1){
for(int i=1;i<=p;i++){
if(m<a[i]){
q=i;
break;
}
}
cout<<q;
}else{
for(int i=n;i>=p;i--){
if(m<a[i]){
q=i;
break;
}
}
cout<<q+1;
}
}
return 0;
}
后来跟着老师傅学了二分查找,就利用二分查找优化了我之前的代码(如下):
#include<bits/stdc++.h>
using namespace std;
int a[100055];
int main(){
int n,m,p,k,l,r,mid;
cin>>n>>m;
int max=0;
int mark=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(max<a[i]){
max=a[i];
p=i;
}
}
if(m>max){
cout<<p+1;
}else{
cin>>k;
if(k==1){
l=1;r=p;
while(l<=r){
mid=(l+r)/2;
if(a[mid]>=m){
mark=mid;
r=mid-1;
}else{
l=mid+1;
}
}
if(mark){
cout<<mark;
}
}else{
l=p;r=n;
while(l<=r){
mid=(l+r)/2;
if(a[mid]>=m){
mark=mid;
l=mid+1;
}else{
r=mid-1;
}
}
if(mark){
cout<<mark+1;
}
}
}
return 0;
}
需要注意的是(仅对于这类题)二分查找如果用的不熟练并不建议使用,因为在这里它本质起的是优化作用(降低算法复杂度),大家这里也可以看到,使用了二分查找,代码貌似复杂了点?!
二分查找只能用于有序列中,并且二分查找对于升序,降序的使用法则有所区别,用的时候要好好斟酌一下。当然二分查找也不仅仅是只能起优化作用,对于特定题型,二分查找就是核心算法!
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复