1. 程式人生 > >poj 3253 Fence Repair 貪心

poj 3253 Fence Repair 貪心

lock cnblogs air rep con scanf tdi urn pri

poj 3253 Fence Repair

題目鏈接:

http://poj.org/problem?id=3253

思路:

哈夫曼樹型貪心
自底向上每次挑選兩個最小的數值相加,相加的值從新合並到數組中,繼續挑選相加
如果每次都要排序的話會超時....

代碼:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
typedef long long ll;
const int maxn =  20005;
const
ll INF = 500000; ll a[maxn]; int main() { ll n,sum; scanf("%I64d",&n); for(int i=0;i<n;++i) { scanf("%I64d",&a[i]); } sum=0; ll minfir,minsec,temp; while(n>1) { minfir=0;minsec=1; if(a[minfir]>a[minsec]) swap(minfir,minsec); for
(int i=2;i<n;++i) { if(a[i]<a[minfir]) { minsec=minfir; minfir=i; } else if(a[i]<a[minsec]) { minsec=i; } } temp=a[minfir]+a[minsec]; sum+=temp; if(minfir==n-1)swap(minfir,minsec); a[minfir]=temp; a[minsec]=a[n-1
]; n--; } printf("%I64d\n",sum); return 0; }

poj 3253 Fence Repair 貪心