Fence Repair(POJ 3253)

  刷了好久的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 }

猜你喜欢

转载自www.cnblogs.com/Ray-/p/10642904.html