手写堆
以合并果子为例
题目描述
输入格式
输出格式
样例
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 10010
using namespace std;
int read() {
int sum=0,f=1;char x=getchar();
while(x<'0'||x>'9')f=(x=='-')?-1:1,x=getchar();
while(x>='0'&&x<='9')sum=(sum<<3)+(sum<<1)+x-'0',x=getchar();
return sum*f;
}
int n,ans;
template <class qty> struct dui {
qty q[N];
int sz;
dui(){sz=0;}
inline void push(int x) {
q[++sz]=x;
for(int i=sz,j=i>>1;j;i=j,j>>=1)
if(q[j]>q[i]) swap(q[j],q[i]);
}
inline void pop() {
q[1]=q[sz--];
for(int i=1,j=i<<1;j<=sz;i=j,j<<=1) {
if((j|1)<=sz&&q[j|1]<q[j]) j=j|1;
if(q[i]>q[j]) swap(q[i],q[j]);
else break;
}
}
inline qty top(){return q[1];}
};
dui<int> q;
int main() {
n=read();
for(int i=1,x;i<=n;i++) {
x=read();
q.push(x);
}
int x,y;
while(q.sz!=1) {
x=q.top();q.pop();
y=q.top();q.pop();
ans+=x+y;
q.push(x+y);
}
printf("%d",ans);
return 0;
}
这是我一开始打的代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> > q;
int main()
{
int n,tot=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
q.push(x);
}
for(int i=1;i<n;i++)
{
int x=q.top();
q.pop();
int y=q.top();
q.pop();
tot+=x+y;
q.push(x+y);
}
cout<<tot<<endl;
return 0;
}

浙公网安备 33010602011771号