题解 | #牛牛算数#

牛牛算数

http://www.nowcoder.com/practice/1732b7aad48c47cf89867a9f37bf80b6

一.题目描述
NC575牛牛算数
计算x,y两个数的和,需要花费秒,并且每次只能计算一次,怎么合理安排计算的顺序,可以使得花费的时间最短,输出计算n个数字和的最小花费的时间。
图片说明
二.算法(优先队列)
利用STL中的priority_queue来解决问题,用priority_queue来模拟小根堆,开始对所有花费时间插入堆中。每次弹出两个堆中元素对两个元素的和进行累加,然后将结果再放入堆中排序,直至堆中只有一个元素。最后的返回值是两个元素的和的累加值乘以c。
图片说明
下面是完整代码:

class Solution {
public:
    long long solve(int n, int c, vector<int>& a) {
        //利用priority_queue建立小根堆
        priority_queue<int,vector<int>,greater<int>>q;
        for(int i=0;i<n;i++){
            //将所有的时间都入堆
            q.push(a[i]);
        }
        long long int sum=0;//记录累加值
        while(q.size()!=1){
            int x=q.top();
            q.pop();
            int y=q.top();
            q.pop();
            //弹出堆头的两个元素
            q.push(x+y);
            //两个数的累加值进队
            sum+=(x+y);
        }
        return sum*c;
    }
};

时间复杂度:对于n个元素每一个元素插入堆的时间复杂度是,所以时间复杂度是
空间复杂度: 堆的元素不超过n
优缺点:思路简单,代码实现容易
三.算法(模拟)
首先利用map对所用元素进行标记,然后每次找出所有时间中最小的那个时间并删除,连续两次操作,然后记录两个最小值累加的和,然后对于两个最小值的累加和进行标记,一次进行直至map中只有一个元素,返回两个最小值的和的累加值乘以c,下面是完整代码:

class Solution {
public:
    map<int,int>mp;
    //找到最小值返回并且删除最小值
    long long findmin(){
        //map会对前一个元素进行排序
        long long int mi=mp.begin()->first;
        if(--mp[mi]==0){
            //对最小值进行删除
            mp.erase(mi);
        }
        return mi;
    }
    long long solve(int n, int c, vector<int>& a) {
        long long sum=0;
        for(int i=0;i<n; i++){
            mp[a[i]]++;//对所有的时间进行标记
        }
        for(int i = 0;i<n-1;i++){
            long long x=findmin();//找到返回最小值并删除
            long long y=findmin();//找到返回最小值并删除
            sum+=(x+y);//对两个数的和进行累加
            mp[x+y]++; //标记两个数的和
        }
        return sum*c;
    }
};

时间复杂度: 进行了n次遍历,每一次操作时间复杂度是
空间复杂度: 对n个元素进行了标记
优缺点:思路简单,代码实现也容易

全部评论

相关推荐

不愿透露姓名的神秘牛友
2024-12-18 15:35
程序员牛肉:完全是在胡写简历。 我很好奇你干嘛要在教育经历里面写你是软件二班的班长?你写它的目的是什么?我觉得真的就是很突兀。给我第一感觉就是:你真的是一个心智健全的成年人吗? 另外我也很好奇你是怎么做到参加了这么多所谓的计算机比赛,完事儿一个拿得出手的项目都没有。 自己的项目经历还是图书馆管理系统这种垃圾东西……我的的建议是你都不如大幅度删减一下自己的水奖项,看着真的给人一种又水又学傻了的感觉。 计算机不看奖项,看院校和个人能力。 计算机是强工科,你要投后端的你就应该明白,人家招你进去是指望你干活儿的。那你觉得你这份简历有展示出你的后端水平吗? 你动动你的脑子想一想,人家面试官要想通过你的简历看出你的项目开发能力,最重要的板块就是两个,第一个是你的实习,第二个是你的项目。你没有实习,是不是就应该在项目上好好琢磨琢磨? 你自己看看你项目写的什么描述,你作为一个要后端岗位的应届生,你对你自己项目的描述还仅仅停留在使用mySQL,使用JAVA,使用spring boot框架。给人一眼感觉就感觉完全就是你做的玩具。可能就是你哪一个学期做的课设。 对于应届生来讲,在项目板块要尽量突出自己的技术能力,因为谈业务你肯定也不懂。简单来讲,你的项目要清晰准确的表达:你用哪种技术解决了现有的哪种技术问题,带来了多少的效益提升? 所有关于项目的描述都围绕我说的这种表达方式去写。不要自己自嗨式的写一堆垃圾上去 你既没有实习项目,又没有一个比较好一点的项目,而且院校也比较差,所以找工作会异常的难找。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务