• 合并果子


    合并果子

    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;
    }
    
  • 相关阅读:
    白书数据结构基础总结
    UVA 10557 XYZZY 结题报告
    UVA 10047 The Monocycle 解题报告
    二叉查找树及其C语言实现
    堆排序及其c语言实现
    约瑟夫环问题小结
    KMP算法总结
    UVA 10129 Play on Words 解题报告
    深入浅出Node.js (8)
    洛谷 P1757 通天之分组背包
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12079258.html
Copyright © 2020-2023  润新知