这个题一开是自己的思路是把所有数字排序之后再分治(分为大小差值最小的两份)。
看了别人的解题报告之后,发现,这个题可以像哈夫曼那样自下向上去做。比用分治(自上向下)简单。
用的是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;
}
poj 3253
最新推荐文章于 2023-01-06 17:52:15 发布