题目描述
小明买了 nn 件白色的衣服,他觉得所有衣服都是一种颜色太单调,希望对这些衣服进行染色,每次染色时,他会将某种颜色的所有衣服寄去染色厂,第 ii 件衣服的邮费为 aiai 元,染色厂会按照小明的要求将其中一部分衣服染成同一种任意的颜色,之后将衣服寄给小明, 请问小明要将 nn 件衣服染成不同颜色的最小代价是多少?
输入描述
第一行为一个整数 nn ,表示衣服的数量。
第二行包括 nn 个整数 a1,a2...ana1,a2...an 表示第 ii 件衣服的邮费为 aiai 元。
(1≤n≤105,1≤ai≤1091≤n≤105,1≤ai≤109 )
输出描述
输出一个整数表示小明所要花费的最小代价。
输入输出样例
示例 1
输入
5
5 1 3 2 1
输出
25
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
int main()
{
priority_queue<ll,vector<ll>,greater<ll>> heap;
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
ll x;
scanf("%lld",&x);
heap.push(x);
}
ll res=0;
while(heap.size()>1)
{
ll a=heap.top(); heap.pop();
ll b=heap.top(); heap.pop();
res+=(a+b);
heap.push(a+b);
}
printf("%lld",res);
return 0;
}