蓝桥杯 试题 基础练习 Huffuman树

思路:
很明显我们要满足的是要求每次得到的数组从小到大排列,然后每次取出前两个最小的,然后我们将其相加再次加入数组,直到只剩一个数字为止!

那么我们很容易想到STL容器中set,但是可能有重复数字,set会自动去重,怎么办?这个时候我们就要用到multiset了,其与set操作差不多,但是能保留重复数字!

不懂可以看大佬博客
AC代码如下

#include<bits/stdc++.h>

using namespace std;

multiset<int> mp;//允许有重复数字并且从小到大排列 
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int res;
		cin>>res;
		mp.insert(res);
	}
	int ans = 0;//计算总数
	int flag;
	for(int i=1;i<=n-1;i++){//得到一个数需要执行n-1次操作 
	   flag = 0;
	   flag = *mp.begin();//加第一个数 
	   mp.erase(mp.begin());//删除 
	   flag += *mp.begin(); //加第二个数
	   mp.erase(mp.begin());//删除
	   mp.insert(flag);
	   ans += flag; 
	} 
	cout<<ans<<endl;
	return 0;
} 
发布了177 篇原创文章 · 获赞 6 · 访问量 6390

猜你喜欢

转载自blog.csdn.net/qq_45585519/article/details/104648953