小记优先队列
优先队列
priority_queue<int,vector<int>,greater<int> > que;
#include <iostream>
#include <algorithm>
#include <queue>
#include <assert.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main() {
int n;
cin>>n;
int sum=0;
int all=0;
int a[n];
priority_queue<int,vector<int>,greater<int> > que;
//按从小到大排序
for(int i=0; i<n; i++) {
cin>>a[i];
}
sort(a,a+n);
// for(int i=0;i<n;i++){
// cout<<a[i]<<"======"<<endl;
// }
for(int i=0;i<n;i++){
que.push(a[i]);
}
while(!que.empty()){ //当前队列不为空
if(que.size()==1){
cout<<all<<endl;
break;
}else{
int p=que.top();//基于优先级最高的元素
que.pop();
int q=que.top();
que.pop();
sum=p+q;
all=all+sum;
que.push(sum);
}
}
return 0;
}
代码所解决的题目:例如有 33 种果子,数目依次为 11 , 22 , 99 。可以先将 11 、 22 堆合并,新堆数目为 33 ,耗费体力为 33 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 1212 ,耗费体力为 1212 。所以多多总共耗费体力 =3+12=15=3+12=15 。可以证明 1515 为最小的体力耗费值。
注:题目出自洛谷P1090