合并果子

 题解还是要坚持更的,哪怕是一道基础题。

原题链接:https://www.luogu.org/problem/show?pid=1090#sub

简单来讲,这道题要让我们把元素两两合并,每次合并的代价是两元素之和,最后求一个最小代价。

贪心思想很明显,每次取两个最小的,再把这个最小的放到原来的堆里的合适的位置,直到只剩下一个堆。

手写小根堆或者STL的优先队列就可以过。

使用STL的优先队列时要注意循环取出放入的时候边界条件不是队列非空,应该是队列大小不等于1。

因为最后会剩下 一个最终的堆。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,a,x,y;
 4 priority_queue<int,vector<int>,greater<int> > q;
 5 int main(){
 6     cin >> n;
 7     for (int i=1;i<=n;i++){
 8         cin >> a;
 9         q.push(a);
10     }
11     int ans = 0;
12     while (q.size() != 1){
13         x = q.top();
14         q.pop();
15         y = q.top();
16         q.pop();
17         q.push(x+y);
18         ans = ans+x+y;
19     }
20     cout << ans << endl;
21     return 0;
22 }

  明天晚上翘自习去机房,期望能切几道稍微难一点的题。

  (滚去看rec

原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7499853.html