P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G multiset优化

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
这是一道贪心算法的题目,每次选择两个最小的堆,合并后,继续直到只有一堆为止,可能用multiset进行维护。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	multiset<int> s;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int a;
		cin>>a;
		s.insert(a);
	}	
	multiset<int>::iterator iter;
	int ans=0;
	for(int i=1;i<n;i++)
	{
		int total=0;
		iter=s.begin();//取当前最小值
		total+=*iter;//当前合并的费用
		s.erase(iter);//删除
		iter=s.begin();//取当前最小值
		total+=*iter;//当前合并的费用
		s.erase(iter);//删除
		ans+=total;//统计总费用
		s.insert(total); //新增新的堆
	}
	cout<<ans;
 } 

  

posted @ 2022-03-12 19:34  心悟&&星际  阅读(63)  评论(0)    收藏  举报