xdoj 1144 K叉哈弗曼树

n个节点k叉。(如果(n-1)%(k-1)!=0)先合并(n-1)%(k-1)+1个节点再k个K个合并

#include<bits/stdc++.h>
using namespace std;
long long a[1005];
queue<long long> q1,q2;
long long hafuman(int n,int k)
{
	while(!q2.empty()) q2.pop();
	int temp;
	long long sum=0,t;
	if((n-1)%(k-1)==0)
	temp=k;
	else 
	temp=(n-1)%(k-1)+1;
	while(temp--)
	{
	 sum+=q1.front();
	 q1.pop();
     }
     t=sum;
     q2.push(sum);
     temp=k;
	while(!q1.empty())
	{
		sum=0;
		for(int i=0;i<k;i++)
		{
			if(!q2.empty()&&!q1.empty())
			{
				if(q1.front()>q2.front())
				{
					sum+=q2.front();
					q2.pop();
				}
				else
				{
					sum+=q1.front();
					q1.pop();
				}
			}
			else if(!q1.empty())
			{
				sum+=q1.front();
				q1.pop();
			}
			else 
			{
				sum+=q2.front();
				q2.pop();
			}
		}
		t+=sum;
		q2.push(sum);
	}
	if(q2.size()==1)
	return t;
	else
	{
		while(1)
		{
		  sum=0;
		 for(int i=0;i<k;i++)
		 {
			sum+=q2.front();
			q2.pop();
		 }
		 t+=sum;
		 q2.push(sum);
		 if(q2.size()==1)
		 return t;
	   }
	}
	
}
int main()
{
	int n,k;
	while(~scanf("%d %d",&n,&k))
	{
		for(int i=0;i<n;i++)
		scanf("%lld",&a[i]);
		sort(a,a+n);
		for(int i=0;i<n;i++)
		q1.push(a[i]);
		long long ans=hafuman(n,k);
		printf("%lld\n",ans);
	}
	
}
    原文作者:哈夫曼树
    原文地址: https://blog.csdn.net/silence401/article/details/53292861
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞