洛谷p1046:用一个题练习排序+二分查找

以上是题目要求,虽然数据量很少我们可以直接用一个count变量记录然后循环10次挨着比大小。但是不难发现这个题完全可以先对数组排序随后找到第一个大于能触及的最大高度的值的所在下标(下标从0开始则下标为i代表前面有i个数)。因此我们可以使用排序+二分的思路进行操作。

排序的代码我之前写过插排冒泡和选择。这个题排序不是重点我们当然也可以直接用sort,但这里我为了锻炼下自己对排序算法的熟练度因此写的冒泡排序。

剩下就是关键的二分查找代码。我代码的模板是看的灵茶山艾府大佬的,大家感兴趣最好看下原视频。这里我简单复述下实现思路:对于一个有序数组,若当前一个元素是小于目标值的,则其左边也肯定小于,而我们的目标是寻找第一个>=目标值的函数因此下次可以把左边界更新为mid+1(取mid就可以实现每次都排除一半的数)。那如果mid所在的数>=目标值我们就让r=mid-1;(r右边的数肯定都>=,但我们要找的是第一个>=,因此继续让r指针左移。由于我们始终保证r的右边>=目标值而l的左边小于目标值。那么当退出循环时刚好是l在r的右边,即此时l就是我们要找的第一个>=目标值的下标(r的右边是>=的,但我们要的是第一个,因此当r在l的左边时就能确定是第一个)。这个题由于要找的是第一个大于目标值的数,实际等效于找到第一个>=目标值+1的数。因此代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
	int a[10];
	int h;
	
	for(int i=0;i<10;i++){
		cin>>a[i];
	}
	cin>>h;
	
	int end = 9;
	bool flag = true;
	while(flag){
		flag = false;
		for(int i=0;i<end;i++){
			
			if(a[i]>a[i+1]){
				swap(a[i],a[i+1]);
				flag = true;
			}
		}
		end--;
	}
	int tar = h+30;
	//寻找第一个大于tar的数,其前面的数则都可以取到
	int l=0,r=9;
	while(l<=r){
		int mid = l+(r-l)/2;
		if(a[mid]<tar+1){
			l=mid+1;
		}else{
			r=mid-1;
		}
	} 
	cout<<l;
}

这个题是很简单的,只是刚好可以用来训练下排序和二分查找的写法,因此我觉得大家如果对这两块的算法实现不太熟悉的话可以用这个题来练下。因为算法模板b站上有因此这里只是简单解释了下,大家如果觉得有问题的话也可以私信问我我尽量解释清楚

相关推荐
zyl76510 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖14 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌14 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F14 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791314 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins14 小时前
c++新增頭文件
c++
Shadow(⊙o⊙)14 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
tomwang032214 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!14 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by2099914 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表