题目:
思路:
主要是通过这道题目学习一下二叉堆和优先队列
用priority_queue来实现二叉堆(大顶堆和小顶堆)
注意要加头文件 #include <queue>
默认为大顶堆 priority_queue<int> q 小顶堆 priority_queue<数据类型,vector<数据类型>,greater<数据类型>> q
eg:
priority_queue<int,vector<int>,greater<int>> q
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii>> q
q.top().first
q.top().second
数据类型的位置也可以放自定义的struct(struct里可以运算符重载
AC代码:
直接调用:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#define maxn 11111
using namespace std;
int n,x;
priority_queue<int,vector<int>,greater<int>> q;
long long ans;
int main()
{
cin>>n;ans=0;for(int i=1;i<=n;i++){
cin>>x;q.push(x);} for(int i=1;i<n;i++){
int temp=0;temp+=q.top();//cout<<"temp1 "<<temp<<endl;q.pop();temp+=q.top();q.pop();//cout<<"temp2 "<<temp<<endl;q.push(temp);ans+=temp;//cout<<"!!!"<<ans<<endl;}cout<<ans<<endl;return 0;
}
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#define maxn 22222
using namespace std;
int n,x;
//priority_queue<int,vector<int>,greater<int>> q;
struct PQ
{
int a[maxn],sz=0;int size(){
return sz;}bool empty(){
return sz==0;}void push(int x){
a[++sz]=x;int now=sz;while (now!=1){
if (a[now>>1]>a[now]){
swap(a[now>>1],a[now]);now>>=1;}else break;}}int top(){
return a[1];}void pop(){
a[1]=a[sz--];int now=1;while (now<<1<=sz){
if (a[now<<1]<a[now]&&a[now<<1|1]<a[now]){
if (a[now<<1]<a[now<<1|1]) {
swap(a[now<<1],a[now]);now=now<<1;}else {
swap(a[now<<1|1],a[now]);now=now<<1|1;}}else{
if (a[now<<1]<a[now]) {
swap(a[now<<1],a[now]);now=now<<1;}else if (now<<1<sz&&a[now<<1|1]<a[now]) {
swap(a[now<<1|1],a[now]);now=now<<1|1;}else break;}}}
}q;
long long ans;
int main()
{
cin>>n;ans=0;for(int i=1;i<=n;i++){
cin>>x;q.push(x);} for(int i=1;i<n;i++){
int temp=0;temp+=q.top();//cout<<"temp1 "<<temp<<endl;q.pop();temp+=q.top();q.pop();//cout<<"temp2 "<<temp<<endl;q.push(temp);ans+=temp;//cout<<"!!!"<<ans<<endl;}cout<<ans<<endl;return 0;
}