合并果子(lgP1090)

贪心。

每次取最小的两堆合并,最后即为正确答案。(我也不会证明/wq)

所以说主要问题就是怎么找最小的两堆。

由于中间不断有插入和删除,所以用优先队列。

扯不下去了 直接看代码吧。

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int n,a[10001];
long long ans;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		q.push(a[i]);
	}
	while(q.size()>=2)
	{
		int x=q.top();q.pop();
		int y=q.top();q.pop();
		q.push(x+y);
		ans+=x+y;
	}
	cout<<ans;
}
posted @ 2021-01-15 21:00  樱雪喵  阅读(98)  评论(0编辑  收藏  举报