牛牛算数题解

题解

  1. 首先我们可以把c提出来。

  2. 然后我们考虑既然我们一定要计算出一个总答案,我们如何才能最小化花费呢?

  3. 我们贪心的考虑,是不是每次选取最小的两个数字合并会花费最小呢?

  4. 举一个例子,比如:有a,b,d三个数,c为100
    最后结果为:ans = ((a + b) * 100 + d) * 100= (a + b) * 10000 + d*100
    表明越先选取的数字他所乘积的权重越大。所以先选小的好。

  5. 所以我们只需要通过一个最小堆来维护一下即可。

class Solution {
public:
    /**
     * 返回一个数字表示输出计算n个数字和的最小花费的时间。
     * @param n int整型 表示有n个数。
     * @param c int整型 参数c
     * @param a int整型vector ai表示第i个数的大小
     * @return long长整型
     */
    long long solve(int n, int c, vector<int>& a) {
        // write code here
        long long ans=0;
        priority_queue<long long ,vector<long long >,greater<long long > > h;
        for (int i=0; i<n; i++)
        {
            h.push(a[i]);

        }
        long long  x,y;
        for (int i=1; i<n; i++)
        {
            x=h.top(),h.pop();
            y=h.top(),h.pop();
            ans+=(x+y); h.push(x+y);
        }
        ans=ans*(long long )c;
        return ans;
        }
};
全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务