1 条题解

  • 0
    @ 2026-2-1 15:55:26
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        vector<int> arr; // 存储每种果子的数量
        int n;
        cin >> n; // [1] 输入果子的种类数n
        // [2] 输入每种果子的数量并加入数组
        for(int i = 0; i < n; i++){
            long long a;
            cin >> a;
            arr.push_back(a);
        }
        sort(arr.begin(), arr.end()); // [3] 对果子数量数组升序排序,便于每次取最小两堆
        long long sum = 0; // 存储最小总体力消耗
        
        // [4] 进行n-1次合并操作,最终合并成1堆
        for(int i = 0; i < n-1; i++){
            long long x = arr[i] + arr[i+1]; // 取出当前最小的两堆果子,计算合并后的数量
            sum += x; // 累加本次合并的体力消耗
            int j = i + 2; // 从下一个位置开始,寻找合并后新堆的插入位置
            // [5] 将新堆x插入到数组中,保持数组升序
            while(x > arr[j] && j < n){
                arr[j-1] = arr[j]; // 当前位置元素后移,为x腾出位置
                j++;
            }
            arr[j-1] = x; // 将x插入到合适位置
        }
        cout << sum; // [6] 输出最小体力消耗值
        return 0;
    }
    
    • 1

    信息

    ID
    1042
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    6
    已通过
    1
    上传者