描述
农夫约翰想要修篱墙,他需要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 }
时间: 2024-11-03 22:25:07