链接:
https://www.nowcoder.com/acm/contest/124/G
来源:牛客网
来源:牛客网
题目描述
2018年4月8日星期日,小龙沉迷于一个叫做组合的游戏。
游戏规则是这样的,原本有一个长度为A的大木板,现在把它分成了n份长度可能不一样的木板。每一个模板的长度为Xi,每次游戏都要把这些木板组合为一个完整的木板,但是小龙每次只能拿两个小木板去组合成为一个,然后把这新木板和剩下的木板放在一起,重复以上步骤直到最后只剩下一个木板。
每次组合木板会花费K个金币,K等于拿起的两个木板长度之和,问小明每次玩游戏最少花费是多少?
例如:当有n=3块木板的时候
每一块木板的长度分别是是 1、2、3
第一次拿长度为1 和 2 的木板拼接成长度为3的木板,花费3个金币
此时有两块木板,长度分别为3 和 3
第二次拿长度为3 和3 的木板拼接成长度为6的木板,花费6个金币
总共花费9个金币(最少)。
输入描述:
输入有多组,每一组第一行是n(1 < n <= 200)
接下来第二行到第n+1行,第i+1行表示小木板的长度X i (X i <= 200)输出描述:
输出每个样例的最少花费,每个答案占据一行。
示例1
输入
3123
输出
9
思路:很简单的贪心,就是用来一下multiset,因为自己很不熟悉,所以下一篇博客而已。。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define mod 1000000007
long long T,n,num,p,k,a,b,c,x,ans;
int main()
{
multiset<int>s;
while(~scanf("%lld",&n))
{
s.clear();
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
s.insert(x);
}
while(s.size()>1)
{
a=*s.begin();
s.erase(s.begin());
b=*s.begin();
s.erase(s.begin());
ans+=a+b;
//0-cout<<a<<" "<<b<<" "<<ans<<" "<<a+b<<endl;
s.insert(a+b);
}
cout<<ans<<endl;
}
}