1. 程式人生 > >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;
}