1. 程式人生 > >Fence Repair POJ

Fence Repair POJ

白書上的一道貪心問題,  做法也是仿照書中的做法來做的

把切割方法模擬為一個二叉樹, 用陣列來模擬即可, 每次最短的兩個點一定是兄弟節點, 注意對奇書版數的特判

//Fence Repair 貪心
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(n));
typedef  long long ll;
const ll maxn = 20010;

int N, plank[maxn];
ll solve()
{
    ll ans = 0;
    //直到計算到模板為1塊為止
    while(N > 1){
        int min1 = 0, min2 = 1; //最小的和其次小的
        if(plank[min2] < plank[min1]) swap(min1, min2);
        //找出每次最小的和其次小的
        for(int i = 2; i < N; i++){
            if(plank[i] < plank[min1]) min2 = min1, min1 = i;
            else if(plank[i] < plank[min2]) min2 = i;
        }
        int t = plank[min1] + plank[min2];
        ans += t;
        if(min1 == N-1) swap(min1, min2); // 只剩一個的情況
        plank[min1] = t, plank[min2] = plank[N-1]; //用陣列模擬樹的節點
        N--;
    }
    return ans;
}
int main()
{
    cin >> N;
    for(int i = 0; i < N; i++)
        cin >> plank[i];
    printf("%lld\n",solve());
    return 0;
}