1 条题解

  • 1
    @ 2025-1-8 14:44:46

    小根堆 & 经典哈夫曼树的模型,每次合并重量最小的两堆果子即可。利用小根堆 lognlogn 弹出最值的属性,一共操作 n1n - 1 次,时间复杂度为 nlognnlogn,由于原题数据范围较小,n2n^2 数据也能过(不要这样写)。

    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int N = 100010;
    int res;
    
    int main()
    {
        int n;
        cin >> n;
        priority_queue<int, vector<int>, greater<int>> q;//小根堆 log(n) 弹出最大最小值
         
        while(n --)
        {
            int x;
            scanf("%d", &x);
            q.push(x);
        }
        while(q.size() > 1)//还剩至少2个元素
        {
            int a = q.top(); q.pop();
            int b = q.top(); q.pop();
            res += (a + b);
            q.push(a + b);//新的水果堆
        }
        cout << res << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    5525
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    15
    已通过
    4
    上传者