本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
合并果子
【题目描述】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n − 1 n−1n−1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和.
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为11,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值.
例如有3 33种果子,数目依次为1 , 2 , 9 1,2,91,2,9.可以先将1 , 2 1,21,2堆合并,新堆数目为3 33,耗费体力为3 33.
接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12 1212耗费体力为12 1212.所以多多总共耗费体力= 3 + 12 = 15 =3+12=15=3+12=15.可以证明15 1515为最小的体力耗费值.
【输入】
第一行是一个整数n ( 1 ≤ n ≤ 10000 ) n(1≤n≤10000)n(1≤n≤10000),表示果子的种类数.
第二行包含n nn个整数,用空格分割,第i ii个整数a i ( 1 ≤ a i ≤ 20000 ) a_i(1≤a_i≤20000)ai(1≤ai≤20000)是第i ii种果子的数目.
【输出】
包含一行,这一行只包含一个整数,也就是最小的体力耗费值.输入数据保证这个值小于2 31 2^{31}231.
【输入样例】
3 1 2 9【输出样例】
15【算法标签】
#堆排序#
【代码详解】
#include<queue>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;intn,x,sum;// sum: 总合并代价priority_queue<int,vector<int>,greater<int>>q;// 小根堆intmain(){cin>>n;for(inti=1;i<=n;i++){cin>>x;q.push(x);// 将所有数插入小根堆}// cout<<q.top()<<endl;// 哈夫曼编码/合并果子算法for(inti=1;i<n;i++){intx1=q.top();// 取出最小的q.pop();intx2=q.top();// 取出次小的q.pop();sum+=x1+x2;// 累加合并代价q.push(x1+x2);// 将合并结果放回堆中}cout<<sum;return0;}【运行结果】
3 1 2 9 15