首页 > 代码库 > NOJ1076 机器狗组装费用 贪心

NOJ1076 机器狗组装费用 贪心

题目描述

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


输入

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

输出

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

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


样例输入

10
1 2 3 4 5 6 7 8 9 0

样例输出

136



解题思路

题目抽象起来就是n个数字的两两合并 明显可以用贪心来解 只需要知道当前的最小的两个零件 把它们组合起来即可。O(n^2)搞定  详见代码


#include <cstdio>
#include <algorithm>
#define ll long long
#define INF 1000000010
using namespace std;
const int maxn = 10010;
int s[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0 ; i < n ; i ++) scanf("%d",&s[i]);
    ll sum = 0;
    if(n == 1) {
        printf("%d\n",s[0]);
    }else {
        //????n-1??
        int t = n-1;
        while(t--) {
            //??s??????????????????
            int pt1,pt2;
            int _min = INF;
            for(int i = 0; i < n ; i ++) {
                if(_min > s[i]) {
                    pt1 = i;
                    _min = s[i];
                }
            }
            _min = INF;
            for(int i = 0 ; i < n ; i ++) {
                if(_min > s[i] && i != pt1) {
                    pt2 = i;
                    _min = s[i];
                }
            }
            sum += s[pt1] + s[pt2];
            s[pt1] = s[pt1] + s[pt2];
            s[pt2] = INF;
        }
        printf("%lld\n",sum);
    }
    return 0;
}


NOJ1076 机器狗组装费用 贪心