合并果子 CSU1588 (优先队列+贪心策略)

版权声明:版权所有 https://blog.csdn.net/Adusts/article/details/80514323

Description

现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。

Input

第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。

Output

每组数据仅一行,表示最小合并代价。

Sample Input

2
4
1 2 3 4
5
3 5 2 1 4

Sample Output

19
33

优先队列有一个功能是元素在入队的同时进行自动排序,默认非升序;这时候需要自定义排序类型,然后每次把队列的前两个元素加起来再入队。

priority_queue <int,vector<int>,less<int> > p; //非升序

priority_queue <int,vector<int>,greater<int> > q; //非降序

#include <iostream>
#include <queue>
using namespace std;
int main() {
	int t, m, x, s;
	cin>>t;
	while(t--) {
		s = 0;
		priority_queue <int,vector<int>,greater<int> > q;
		cin>>m;
		int l = m;
		while(m--) {
			cin>>x;
			q.push(x);
		}
		for(int i = 1; i < l; i++) {
			int a = q.top();
			q.pop();
			a += q.top();
			q.pop();
			s += a;
			q.push(a);	
		}
		cout<<s<<endl;
	}
	return 0;
}

展开阅读全文

没有更多推荐了,返回首页