首先,这是洛谷的一道题。
让你来找用最少的奶牛来达到书架高度。
所以最好的就是先把奶牛按从高到低排序,然后从最高的开始累加,那样的话得到的数目一定是最少的。
所以问题就主要是在排序上,排序有很多种方法,这里可以用sort先给奶牛排序,但这样就太简单了,一行代码就排完序了。
但我今晚看题解 ,有一位大佬用手打堆,正好我就还没学到堆排,就学习了一下。
首先,我理解的堆其实就是一种特殊的数组。
在数组里面按特定的顺序排列给定的数字。
堆有两种:
那么我们怎么找到一个节点的父亲和儿子呢?
这是上图小根堆存在数组里的样子。
第二个点2的父亲是第一个点1,第二个点2的儿子为第四个点3与第五个点7。
得出结论:一个点的父亲为这个点的数组下表整除2;一个点的儿子为这个点的数组下标乘2或乘2加1.比如说节点2 的父亲节点就是2➗2=2,儿子节点就是2×2=4和2×2+1=5
堆中最重要的操作是上浮和下沉,正常的堆都是从小到大或从大到小。
但如果出现了如图的情况
这就破坏了堆的结构,就需要将他上浮或者下沉(这里是下沉,下沉比较麻烦)
首先我们要知道下沉是往更小的地方下沉,就比如这个图,666就应该往2下沉而不是8 ,
没下沉 一次,就交换一次下标,直到不能找到小于他的儿子节点。
上浮的话也是一个道理。
那么我们怎么建立一个堆呢?
加入给了你10个数字。
这时候我们先建一个数组,每一个数字都插入队尾,然后下标加一再将下一个数字存入队尾。
这差不多就是这节课学到的??? 题还没做出来,做出来了等着再加上代码。🧐