二叉堆

文章目录

  • 145. 超市
  • 148. 合并果子

145. 超市

二叉堆_第1张图片
二叉堆_第2张图片

#include 
#include 
#include 
using namespace std;

priority_queue<int, vector<int>, greater<int> > que;
pair<int, int> arr[10005];//过期时间和利润

int main(void)
{
	int n, ans;
	while (cin >> n){
		for (int i = 0; i < n; i++){
			cin >> arr[i].second >> arr[i].first; 
		} 
		sort(arr, arr + n);
		for (int i = 0; i < n; i++){
			if (arr[i].first == que.size()){
				if (arr[i].second > que.top()){
					que.pop();
					que.push(arr[i].second);
				}
			}
			else if (arr[i].first > que.size()){
				que.push(arr[i].second);
			}
		}
		ans = 0;
		while (que.size() > 0){
			ans += que.top();
			que.pop();
		}
		cout << ans << endl;
	}
	return 0;
}

148. 合并果子

二叉堆_第3张图片
二叉堆_第4张图片

这道题的思想是哈夫曼树,每次取出两个最小的数字,合并后再放入堆中,直到最后只剩下一个数字。
可以利用小根堆来高效的实现,时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

#include 
#include 
using namespace std;

priority_queue<int, vector<int>, greater<int> > que;

int main(void)
{
	int n, t, a, b, ans = 0;
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> t;
		que.push(t);
	}
	while (que.size() != 1){
		a = que.top();
		que.pop();
		b = que.top();
		que.pop();
		ans += a + b;
		que.push(a + b);
	}
	cout << ans << endl;
	return 0;
}

你可能感兴趣的:(#,0x10,基本数据结构)