Description
果园里面有n堆果子,每堆果子有xi个,每个果子的重量为1,小明每次把i,j两堆果子移成一堆,需要花费的体力为xi+xj。最后移成一堆,求最小花费体力值。
其中1<=n<=10000,1<=m<=10000。均为正整数。
Input
每组数据第一行输入一个正整数n,表示有n堆果子。
接下来一行有n个正整数,表示每堆果子的重量。
输入以EOF结尾。
Output
每组数据单独一行,输出所花费的最小体力值。
Sample Input
3
1 2 9
5
1 3 9 18 30
Sample Output
15
109
下面是AC代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
bool lyf(int x,int y)
{
return x>y;
}
int main()
{
int t,n,m,a[100005],i;
scanf("%d",&t);
while(t--)
{
priority_queue<int,vector<int>,greater<int> >q;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
q.push(0);
}
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,lyf);
int p;
for(i=0;i<n;i++)
{
p=q.top();
q.pop();
p=p+a[i];
q.push(p);
}
int h=-1;
int s;
while(!q.empty())
{
s=q.top();
if(s>h)
{
h=s;
}
q.pop();
}
printf("%d\n",h);
}
return 0;
}
题目传送门:搬果子(点击可交题)