10分,手打堆,求助
查看原帖
10分,手打堆,求助
476919
爱国者楼主2021/7/24 14:28
#include<bits/stdc++.h>
using namespace std;
long long a[20001],n,sum,ans;
long long top(){return a[1];}
void push(int x)
{
	a[++n]=x;
	for(int i=n;(i>>1)>0&&a[i]>a[i>>1];i>>=1)
		swap(a[i],a[i>>1]);
}
void pop()
{
	a[1]=a[n--];
	int i=1,j;
	while((i<<1)<=n)
	{
		j=i<<1;
		if(j<n&&a[j]>a[j+1])j++;
		if(a[j]>a[i])break;
		swap(a[j],a[i]);
		i=j; 
	} 
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	for(int i=n>>1;i>=1;i--)
	{
		int j=(i<<1);
		if(j<n&&a[j+1]<a[j])j++;
		if(a[j]>a[i])continue;
		swap(a[j],a[i]);
	}
	while(n>1)
	{
		long long x=top();
		pop();
		long long y=top();
		pop();
		ans+=(x+y);
		push(x+y);
	}
	cout<<ans;
	return 0;
}

2021/7/24 14:28
加载中...