题目链接:http://poj.org/problem?id=3253
和合并果子一样,小根堆
贴代码
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=20005;
ll heap[maxn];
int len,n;
void swap(ll &x,ll &y){
ll t;
t=x;x=y;y=t;
}
void put(ll x){
heap[++len]=x;
int son=len;
while ((son!=1)&&(heap[son]<heap[son>>1])){
swap(heap[son],heap[son>>1]);
son=son>>1;
}
}
ll get(){
ll getn=heap[1];
heap[1]=heap[len--];
int fa=1;
int son;
while (fa*2<=len||fa*2+1<=len){
if (fa*2+1>len||heap[fa*2]<=heap[fa*2+1])son=fa*2;
else son=fa*2+1;
if (heap[son]<heap[fa]){
swap(heap[fa],heap[son]);
fa=son;
}else break;
}
return getn;
}
int main(){
// freopen("3253.in","r",stdin);
// freopen("3253.out","w",stdout);
scanf("%d",&n);
len=0;
for (int i=1;i<=n;i++){
ll x;
scanf("%lld",&x);
put(x);
}
n--;
ll ans=0;
while (n--){
ll x=get()+get();
ans+=x;
put(x);
}
printf("%lld",ans);
return 0;
}
【写的有漏洞的,欢迎路过大神吐槽】
2017/07/25 10:55:48
Ending.