zoukankan      html  css  js  c++  java
  • 合并果子

    合并果子

    Description

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多 决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆 果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子 时总共消耗的体力等于每次合并所耗体力之和。
    因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个 果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使 多多耗费的体力最少,并输出这个最小的体力耗费值。
    例如有3种果子,数目依次为1,2,9。可以先将1,2堆合并,新堆数目为3,耗费体力为3。接着,将 新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+ 12=15。可以证明15为最小的体力耗费值。

    Input

    输入包括两行,第一行是一个整数n(1≤n≤10000),表示果子的种类数。 第二行包含n个整数,用空格分隔,第i个整数ai(1≤ai≤20000)是第i种果子的数目。

    Output

    输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证 这个值小于2^31。

    Sample Input

    3
    1 2 9
    

    Sample Output

    15
    

    HINT

    对于30%的数据,保证有n<=1000: 对于50%的数据,保证有n<=5000; 对于全部的数据,保证有n<=10000。

    Source

    #include<bits/stdc++.h>
    using namespace std;
    int s[100001],len;
    void s_up(int p)
    {
        while(p>1&&s[p/2]>s[p])
        {
            swap(s[p/2],s[p]);
            p=p/2;
        }
        return;
    }
    void s_down(int p)
    {
        int lt;
        while(1)
        {
            if(p*2>len) return;
            if(p*2==len) lt=p*2;
            else
            {
                if(s[p*2]<s[p*2+1]) 
                lt=p*2;
                else
                lt=p*2+1;
            }
            if(s[p]>s[lt])
            {
                swap(s[p],s[lt]);
                p=lt;
            }
            else break;
        }
        return;
    }
    void insert(int key)
    {
        len++;
        s[len]=key;
        s_up(len);
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            insert(x);
        }
        int ans=0;
        while(len >1)
        {
            int tmp=s[1];
            s[1]=s[len--];
            s_down(1);
            tmp+=s[1];
            s[1]=s[len--];
            s_down(1);
            insert(tmp);
            ans+=tmp; 
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    Linux下date命令,格式化输出,时间设置
    Linux scp复制文件,不需要输入密码的技巧
    Linux中cp和scp命令的使用方法
    Linux定时任务系统 Cron
    Eclipse启动Tomcat后无法访问项目
    eclipse下tomcat插件配置说明
    RPM方式安装MySQL5.6和windows下安装mysql解压版
    shell script练习
    Eclipse Java注释模板设置详解
    mysql备份还原数据库
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12079258.html
Copyright © 2011-2022 走看看