Problem D: STL-D
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 53 Solved: 17
Description
美旸旸最近拿到了去年蓝桥杯的奖金,他开始膨胀了,于是他买了一个50斤的西瓜,决定和全班同学分享,
为了某种不可描述的原因,他决定把西瓜的重量切得不一样,这个西瓜将被分成n块,第i块的大小为a[i],在切西瓜时,
美美旸会消耗体力,在切一块重量为x的西瓜时,他会消耗x的体力,例如他把重量为3的西瓜分成两块,则会消耗3点
体力,美美旸知道最后n块的西瓜重量,但是由于他微积分只考了99分,他不知道怎样切才能使得体力花费最小,聪明
的你能帮帮他吗?
为了某种不可描述的原因,他决定把西瓜的重量切得不一样,这个西瓜将被分成n块,第i块的大小为a[i],在切西瓜时,
美美旸会消耗体力,在切一块重量为x的西瓜时,他会消耗x的体力,例如他把重量为3的西瓜分成两块,则会消耗3点
体力,美美旸知道最后n块的西瓜重量,但是由于他微积分只考了99分,他不知道怎样切才能使得体力花费最小,聪明
的你能帮帮他吗?
Input
多组组数据
每组数据第一行一个数n,表示西瓜一共被切成n块
第二行n个数,表示n块西瓜的重量
每组数据第一行一个数n,表示西瓜一共被切成n块
第二行n个数,表示n块西瓜的重量
Output
每组数据输出一个数,代表美美旸的最小体力花费
解答
#include <iostream>
#include<queue>
using namespace std;
priority_queue<long long ,vector<long long >,greater<long long > >melon;
int main()
{ int N;
while(cin>>N)
{ long long sum=0;
if(N==0) break;
while(!melon.empty())
{
melon.pop();
}
for(int i=0;i<N;i++)
{
long long x;
cin>>x;
melon.push(x);
}
while(melon.size()>1)
{
long long a=melon.top();
melon.pop();
long long b=melon.top();
melon.pop();
sum+=a+b;
melon.push(a+b);
}
cout<<sum<<endl;
}
return 0;
}