洛谷p1046:用一个题练习排序+二分查找
以上是题目要求虽然数据量很少我们可以直接用一个count变量记录然后循环10次挨着比大小。但是不难发现这个题完全可以先对数组排序随后找到第一个大于能触及的最大高度的值的所在下标下标从0开始则下标为i代表前面有i个数。因此我们可以使用排序二分的思路进行操作。排序的代码我之前写过插排冒泡和选择。这个题排序不是重点我们当然也可以直接用sort但这里我为了锻炼下自己对排序算法的熟练度因此写的冒泡排序。剩下就是关键的二分查找代码。我代码的模板是看的灵茶山艾府大佬的大家感兴趣最好看下原视频。这里我简单复述下实现思路对于一个有序数组若当前一个元素是小于目标值的则其左边也肯定小于而我们的目标是寻找第一个目标值的函数因此下次可以把左边界更新为mid1取mid就可以实现每次都排除一半的数。那如果mid所在的数目标值我们就让rmid-1;(r右边的数肯定都,但我们要找的是第一个,因此继续让r指针左移。由于我们始终保证r的右边目标值而l的左边小于目标值。那么当退出循环时刚好是l在r的右边即此时l就是我们要找的第一个目标值的下标r的右边是的但我们要的是第一个因此当r在l的左边时就能确定是第一个。这个题由于要找的是第一个大于目标值的数实际等效于找到第一个目标值1的数。因此代码如下#includebits/stdc.husingnamespacestd;intmain(){inta[10];inth;for(inti0;i10;i){cina[i];}cinh;intend9;boolflagtrue;while(flag){flagfalse;for(inti0;iend;i){if(a[i]a[i1]){swap(a[i],a[i1]);flagtrue;}}end--;}inttarh30;//寻找第一个大于tar的数其前面的数则都可以取到intl0,r9;while(lr){intmidl(r-l)/2;if(a[mid]tar1){lmid1;}else{rmid-1;}}coutl;}这个题是很简单的只是刚好可以用来训练下排序和二分查找的写法因此我觉得大家如果对这两块的算法实现不太熟悉的话可以用这个题来练下。因为算法模板b站上有因此这里只是简单解释了下大家如果觉得有问题的话也可以私信问我我尽量解释清楚
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2424016.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!