刷了好久的lrj大白书,发现后面很多题没人写的,打算换白书刷了。
题意:把一根木板切成n块长度为ai的短板,木板总长度为n块短板的总和,每次把木板切成两部分需要花费木板当前长度的cost,问分割木板的总cost最小为多少。
我们把分割过程画成一颗二叉树,就能发现每个叶子节点的cost=val*(节点深度-1),显然这就是一颗哈夫曼树,我们按照哈夫曼树的构建,每次取最小的两个节点合并,计算总cost就行了。
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<queue> 5 typedef long long LL; 6 const int N=2e4+7; 7 using namespace std; 8 9 priority_queue<LL,vector<LL>,greater<LL> > pq;//小顶堆 10 int main() 11 { 12 int i,j,n,x; 13 scanf("%d",&n); 14 for(i=0;i<n;i++) 15 { 16 scanf("%d",&x); 17 pq.push(x); 18 } 19 long long ans=0; 20 while(pq.size()>1) 21 { 22 long long p=pq.top(); 23 pq.pop(); 24 long long q=pq.top(); 25 pq.pop(); 26 ans=ans+p+q; 27 pq.push(p+q); 28 } 29 printf("%lld\n",ans); 30 }