**#include<iostream>
#include<cstdio>
using namespace std;
long long k[100000];
void heapadjust(long long h[],int i,int j){ //根的初始化
int d=2*i;
int temp=h[i];
while(d<=j){
if(d+1<=j&&h[d]>h[d+1])d++;
if(temp>h[d]){
h[i]=h[d];
i=d;
d=d✖2;
}
else break;
}
h[i]=temp;
}
int main()
{
int n;
long long sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&k[i]);
for(int i=n/2;i>=1;i--)
heapadjust(k,i,n);
while(n>1){
int x1=k[1];
k[1]=k[n];
heapadjust(k,1,--n);
int x2=k[1];
k[1]=k[n];
heapadjust(k,1,--n);
int y=x1+x2;
k[++n]=y;
sum+=y;
for(int i=n;i>1;i/=2){
if(k[i]<k[i/2])swap(k[i],k[i/2]);
else break;
}
}
printf("%lld",sum);
return 0;
}**
堆(合并果子)
最新推荐文章于 2022-01-14 21:37:04 发布