poj 3253
分类: 堆
题意: 切割平板为指定的分块大小,每一次切割的费用都是当前木块的长度
输入: 切割成的块数N,每块大小xi
输出: 最小的切割费用
自己练习写一写堆,也可用STL的优先队列
1 #include <iostream> 2 #include <vector> 3 #include <map> 4 #include <list> 5 #include <set> 6 #include <deque> 7 #include <stack> 8 #include <queue> 9 #include <algorithm> 10 #include <cmath> 11 #include <cctype> 12 #include <cstdio> 13 #include <iomanip> 14 #include <cmath> 15 #include <cstdio> 16 #include <iostream> 17 #include <string> 18 #include <sstream> 19 #include <cstring> 20 #include <queue> 21 using namespace std; 22 23 ///宏定义 24 const int INF = 990000000; 25 const int MAXN = 50010; 26 const int maxn = MAXN; 27 ///全局变量 和 函数 28 29 30 typedef long long LL; 31 LL n; 32 struct my_priority_queue 33 { 34 LL arr[maxn]; 35 LL sizes; 36 my_priority_queue() 37 { 38 memset(arr, 0, sizeof(arr)); 39 sizes = 0; 40 } 41 void init() 42 { 43 memset(arr, 0, sizeof(arr)); 44 sizes = 0; 45 } 46 void push_in(LL a) 47 { 48 LL cur = ++sizes; 49 arr[cur] = a; 50 while (cur > 1 && arr[cur / 2] > arr[cur]) 51 { 52 LL temp = arr[cur / 2]; 53 arr[cur / 2] = arr[cur]; 54 arr[cur] = temp; 55 cur /= 2; 56 } 57 } 58 int pop_min() 59 { 60 if (sizes <= 0) 61 return -1; 62 LL minnum = arr[1]; 63 arr[1] = arr[sizes]; 64 sizes -= 1; 65 minhipyfy(1); 66 return minnum; 67 } 68 void minhipyfy(LL node) 69 { 70 LL ll = 2 * node; 71 LL rr = 2 * node + 1; 72 LL minimum = node; 73 if (ll <= sizes && arr[ll] < arr[node]) //小于等于,改完就过了 74 { 75 minimum = ll; 76 } 77 if (rr <= sizes && arr[rr] < arr[minimum]) 78 { 79 minimum = rr; 80 } 81 if (minimum != node) 82 { 83 LL temp = arr[node]; 84 arr[node] = arr[minimum]; 85 arr[minimum] = temp; 86 minhipyfy(minimum); 87 } 88 } 89 }; 90 my_priority_queue que; 91 int main() 92 { 93 ///变量定义 94 while (scanf("%lld", &n) != EOF) 95 { 96 LL ans = 0; 97 que.init(); 98 for (int i = 0; i < n; i++) 99 { 100 LL len; 101 scanf("%lld", &len); 102 103 //加入优先队列 104 que.push_in(len); 105 } 106 for (int i = 0; i < n - 1; i++) 107 { 108 LL cur1 = que.pop_min(); 109 LL cur2 = que.pop_min(); 110 cur1 += cur2; 111 que.push_in(cur1); 112 ans += cur1; 113 } 114 printf("%lld\n", ans); 115 116 } 117 118 119 ///结束 120 return 0; 121 }