牛客 124G--组合游戏

链接: 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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值