标签:sub color org pid blank 一点 一个 小根堆 span
题解还是要坚持更的,哪怕是一道基础题。
原题链接: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
标签:sub color org pid blank 一点 一个 小根堆 span
原文地址:http://www.cnblogs.com/OIerShawnZhou/p/7499853.html