#include<stdio.h>
void push(__int64* heap,__int64 n);
__int64 pop(__int64* heap);
int main(void){
__int64 n,i,heap[20000],min1,min2,sum;
scanf("%I64d",&n);
__int64 a[n];
heap[0]=0;
sum=0;
for(i=0;i<n;i++){
scanf("%I64d",&a[i]);
push(heap,a[i]);
}
while(heap[0]>=2){
min1=pop(heap);
min2=pop(heap);
sum+=min1+min2;
push(heap,min1+min2);
}
printf("%I64d\n",sum);
}
void push(__int64* heap,__int64 k){
__int64 i;
heap[0]++;
i=heap[0];
while(i>1){
if(heap[i/2]<=k)
break;
if(heap[i/2]>k)
heap[i]=heap[i/2];
i=i/2;
}
heap[i]=k;
}
__int64 pop(__int64* heap){
__int64 result,i,k;
if(heap[0]==0)
return -1;//返回非法值
result=heap[1];
i=1;
k=heap[heap[0]];
while(i*2<=heap[0]){
if(i*2+1>heap[0]){
if(heap[i*2]>=k)
break;
else{
heap[i]=heap[i*2];
i=i*2;
continue;
}
}
if(i*2+1<=heap[0]){
if(heap[i*2]>=k&&heap[i*2+1]>=k)
break;
if(heap[i*2]<heap[i*2+1]){
heap[i]=heap[i*2];
i=i*2;
}else{
heap[i]=heap[i*2+1];
i=i*2+1;
}
}
}
heap[i]=k;
heap[0]--;
return result;
}
【Peking University Online Judge】3253(Fence Repair)
最新推荐文章于 2021-03-19 23:09:40 发布