洛谷 p1090 合并果子

题意是有一堆果子,一次合并两堆果子,每次消耗的体力是两堆果子的总和,求合成一堆消耗的最小体力

很经典的贪心题,贪心思想没什么好说的,每次选最小的两堆就行

但是这道题可以很完美地通过优先队列解决,同时通过这题了解到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;
}
原文地址:https://www.cnblogs.com/ssNiper/p/11253397.html