首页 > 代码库 > poj_3253_priority queue

poj_3253_priority queue

描述

农夫约翰想要修篱墙,他需要N块木板,第i块板长Li。然后他买了一块很长的板子,足够他分成N块。忽略每次锯板子带来的损失。

约翰忘记买锯子了,于是像Don借。Don要收费,每次锯一下,就要收一次板子长度的钱。Don让约翰自己选择锯的方案。

求问约翰最少要花多少钱。

 

思路

类似Huffman编码的思想。

 

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<functional>
 5 
 6 using namespace std;
 7 
 8 
 9 typedef long long ll;
10 const int MAX_N = 20000;
11 int N, L[MAX_N];
12 
13 void solve()
14 {
15     ll ans = 0;
16     priority_queue<int, vector<int>, greater<int>> que;
17     for (int i = 0; i<N; i++)
18     {
19         que.push(L[i]);
20     }
21 
22     while (que.size()>1)
23     {
24         int l1, l2;
25         l1 = que.top();
26         que.pop();
27         l2 = que.top();
28         que.pop();
29 
30         ans += l1 + l2;
31         que.push(l1 + l2);
32 
33     }
34     printf("%lld\n", ans);
35 }
36 
37 int main()
38 {
39     cin >> N;
40     for (int i = 0; i < N; i++)
41     {
42         cin >> L[i];
43     }
44     solve();
45     return 0;
46 }

 

poj_3253_priority queue