nyoj-55

优先级队列
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std; 
int main()
{ 
    long long  t,n,i,x,y,ans;
    priority_queue<long long,vector<long long>,greater<long long> >s;//从小到大
    cin>>t;
    while(t--)
    {
		while(!s.empty()) s.pop();
        cin>>n;
        for(i=0;i<n;i++)
        {
			cin>>x;
			s.push(x);
        }
        ans=0;
        while(s.size()!=1)
        {
             x=s.top();
			 s.pop();
             y=s.top();
			 s.pop();
			 x=x+y;
             ans+=x;
             s.push(x);
        }
		cout<<ans<<endl;
	}
    return 0;
}
  

  最小根堆(待定)

  数组模拟(哈夫曼树)

#include<iostream>
#include<algorithm>
using namespace std;
long long a[12222];
long long solve(int n)
{
	long long t,ans=0;
	int i,j;
	if(n==1)
		return 0;
	for(i=1;i<n;++i)
	{
		ans+=a[i]+a[i-1];
		a[i]=a[i]+a[i-1];
		j=i+1;
		for(;j<n && a[j-1]>a[j];++j)
		{
			t=a[j-1];
			a[j-1]=a[j];
			a[j]=t;
		}
	}
	return ans;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,i;
		cin>>n;
		for(i=0;i<n;++i)
			cin>>a[i];
		sort(a,a+n);
		cout<<solve(n)<<endl;
	}
	return 0;
}

  

 

 

你可能感兴趣的:(nyoj-55)