poj 3253

  这个题一开是自己的思路是把所有数字排序之后再分治(分为大小差值最小的两份)。
  看了别人的解题报告之后,发现,这个题可以像哈夫曼那样自下向上去做。比用分治(自上向下)简单。

  用的是G++编译器,注意不能用__int64而只能用long long int。

#include<iostream>
#include<fstream>
#include<queue>
using namespace std;

int main()
{
	freopen("input.txt","r",stdin);
	int n;
	int input;
	priority_queue<long long int> mypq;
	long long int sum;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==1)
		{
		      scanf("%d",&input);
                      printf("0\n");
		      continue;
		}
		sum=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&input);
			sum+=input;
			mypq.push(0-input);
		}
		long long int output=0;
		while(mypq.empty()==false)
		{
			long long int temp=0;
			temp-=mypq.top();
			mypq.pop();
			temp-=mypq.top();
			mypq.pop();
			output+=temp;
			if(temp==sum)
				;
			else
				mypq.push(0-temp);
			

		
		}
	        cout<<output<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值