题意是有一堆果子,一次合并两堆果子,每次消耗的体力是两堆果子的总和,求合成一堆消耗的最小体力
很经典的贪心题,贪心思想没什么好说的,每次选最小的两堆就行
但是这道题可以很完美地通过优先队列解决,同时通过这题了解到c++中优先队列的使用,格式是 priority_queue<数据类型,存储容器类型, 优先的判定方式>
每次从对头出两个元素加起来再加到队列直到队列元素为1即可,优先队列可以动态地通过某种法则将新来元素插入适当位置,而不是无脑地插入队尾,本题就是元素小的优先插到前面
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); priority_queue< int, vector<int>, greater<int> > pq; int n; cin >> n; int tmp; for(int i=0; i<n; i++){ cin >> tmp; pq.push(tmp); } int res=0; while( pq.size() >= 2 ){ int a = pq.top(); pq.pop(); int b = pq.top(); pq.pop(); res += a+b; pq.push(a+b); } cout << res; return 0; }