解法
用优先队列,思路参考哈夫曼树(贪心)
思路:很复杂,说结果
n件同色衣服要染成都不同色,求邮费最少;
倒过来想:n件不同颜色衣服,要染成同一种颜色,求邮费最少,所以贪心就是每次寄出两件邮费最少的两件衣服去染
如图所示:
代码
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;//19位十进制
int main(){
ll n;cin>>n;
ll sum=0;
priority_queue<ll,vector<ll>,greater<ll>> q;
while(n--){
ll a;
cin>>a;
q.push(a);
}
while(q.size()>1){
ll a=q.top(); q.pop();
ll b=q.top(); q.pop();
ll c=a+b;
sum+=c;
q.push(c);//c进去,优先队列自动排序了
}
cout<<sum;
return 0;
}