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 }

 

posted on 2013-09-16 09:19  小书包_Ray  阅读(164)  评论(0编辑  收藏  举报

导航