这题还是比较简单的,一开始题没读透出了点小问题,后来经修改就OK了代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[100055];
  4. int main(){
  5. int n,m,p,q,k;
  6. cin>>n>>m;
  7. int max=0;
  8. for(int i=1;i<=n;i++){
  9. cin>>a[i];
  10. if(max<a[i]){
  11. max=a[i];
  12. p=i;
  13. }
  14. }
  15. if(m>max){
  16. cout<<p+1;
  17. }else{
  18. cin>>k;
  19. if(k==1){
  20. for(int i=1;i<=p;i++){
  21. if(m<a[i]){
  22. q=i;
  23. break;
  24. }
  25. }
  26. cout<<q;
  27. }else{
  28. for(int i=n;i>=p;i--){
  29. if(m<a[i]){
  30. q=i;
  31. break;
  32. }
  33. }
  34. cout<<q+1;
  35. }
  36. }
  37. return 0;
  38. }

后来跟着老师傅学了二分查找,就利用二分查找优化了我之前的代码(如下):

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[100055];
  4. int main(){
  5. int n,m,p,k,l,r,mid;
  6. cin>>n>>m;
  7. int max=0;
  8. int mark=0;
  9. for(int i=1;i<=n;i++){
  10. cin>>a[i];
  11. if(max<a[i]){
  12. max=a[i];
  13. p=i;
  14. }
  15. }
  16. if(m>max){
  17. cout<<p+1;
  18. }else{
  19. cin>>k;
  20. if(k==1){
  21. l=1;r=p;
  22. while(l<=r){
  23. mid=(l+r)/2;
  24. if(a[mid]>=m){
  25. mark=mid;
  26. r=mid-1;
  27. }else{
  28. l=mid+1;
  29. }
  30. }
  31. if(mark){
  32. cout<<mark;
  33. }
  34. }else{
  35. l=p;r=n;
  36. while(l<=r){
  37. mid=(l+r)/2;
  38. if(a[mid]>=m){
  39. mark=mid;
  40. l=mid+1;
  41. }else{
  42. r=mid-1;
  43. }
  44. }
  45. if(mark){
  46. cout<<mark+1;
  47. }
  48. }
  49. }
  50. return 0;
  51. }

需要注意的是(仅对于这类题)二分查找如果用的不熟练并不建议使用,因为在这里它本质起的是优化作用(降低算法复杂度),大家这里也可以看到,使用了二分查找,代码貌似复杂了点?!
二分查找只能用于有序列中,并且二分查找对于升序,降序的使用法则有所区别,用的时候要好好斟酌一下。当然二分查找也不仅仅是只能起优化作用,对于特定题型,二分查找就是核心算法!

点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论