• 机器狗组装费用 南邮NOJ 1076 优先权队列


    机器狗组装费用

    时间限制(普通/Java) : 1500 MS/ 4500 MS          运行内存限制 : 65536 KByte
    总提交 : 489            测试通过 : 165 

    题目描述

    sed同学最近迷上了制造机器狗,购置了大量所需零件,零件可以组装为一个组件,这些组件或零件又可以组装为一个大的组件。在制造机器狗中,组件或零件只能两两进行组装,组装的顺序任意。在机器狗中,每个零件都有一个组装成本,每次组装一个组件的费用为各个零件组装成本之和。给定各个零件组装成本(单位为元),你的任务是帮助sed计算他至少花费多少费用。



    输入

    第一行包括一个整数N,表示机器狗零件数(1≤N≤10000)

    第二行为N个正整数,表示每个机器狗零件组装成本(单位为元),整数之间用空格隔开。

    输出

    输出仅一行,即机器狗组装的最少费用。

    注意:输出部分的结尾要求包含一个多余的空行。

    样例输入

    10
    1 2 3 4 5 6 7 8 9 0

    样例输出

    136

    采用优先队列存储每个机器的费用~

    这个会使问题得到很大程度上的简化~
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    struct cmp
    {
        bool operator()(int &x,int &y)  //设置所需优先级,因为默认的是较大值优先级高,但是我们需要的是较小值优先级高
        {
            return x>y;
        }
    };
    priority_queue<int, vector<int>, cmp>q;//定义方法
    int main()
    {
        int n;
        int inf1,inf2;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            int num;
            scanf("%d",&num);
            q.push(num);
        }
        int sum=0;
        for(int i=0;i<n-1;i++)
        {
            inf1=q.top();
            q.pop();   //这时弹出的是优先级最高的数,也就是最小数
            inf2=q.top();
            q.pop();   //这时弹出的是此时优先级最高的数,也就是次小数
            sum+=inf1+inf2;  //存值啦~(≧▽≦)/~啦啦啦
            q.push(inf1+inf2);
        }
        printf("%d
    ",sum);  //最终费用
        return 0;
    }
    
    
    ~优先队列真得好方便~

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    算法笔记--二分图判定
    算法笔记--最小表示法
    Codeforces 525A
    Codeforces 140D
    Codeforces C
    Codeforces 665C
    Codeforces 604B
    Codeforces 285C
    The Fewest Coins POJ
    Triangular Pastures POJ
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965631.html
Copyright © 2020-2023  润新知