Fence Repair POJ
阿新 • • 發佈:2018-12-17
白書上的一道貪心問題, 做法也是仿照書中的做法來做的
把切割方法模擬為一個二叉樹, 用陣列來模擬即可, 每次最短的兩個點一定是兄弟節點, 注意對奇書版數的特判
//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; }