bzoj1724[Usaco2006 Nov]Fence Repair 切割木板*

Posted YuanZiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1724[Usaco2006 Nov]Fence Repair 切割木板*相关的知识,希望对你有一定的参考价值。

bzoj1724[Usaco2006 Nov]Fence Repair 切割木板

题意:

FJ需要n块木板,第i块木板长度为ai。但他只有一块长度为sigma(i,1,n)ai的木板。每切一次的代价为所切割木板的长度,问最小代价。n≤20000

题解:

等价于合并石子(把单块木板的长度看作石子)。故用一个优先队列,每次找最小的两个堆合并起来再放入优先队列,代价计入答案。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 #define maxn 20010
 7 #define ll long long
 8 using namespace std;
 9 
10 inline int read(){
11     char ch=getchar(); int f=1,x=0;
12     while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
13     while(ch>=0&&ch<=9)x=x*10+ch-0,ch=getchar();
14     return f*x;
15 }
16 int n; ll ans;
17 struct nd{ll a; bool operator < (const nd &b)const{return a>b.a;}}; priority_queue<nd>q;
18 int main(){
19     n=read(); inc(i,1,n){int x=read(); q.push((nd){x});}
20     inc(i,1,n-1){ll x=q.top().a; q.pop(); ll y=q.top().a; q.pop(); q.push((nd){x+y}); ans+=x+y;}
21     printf("%lld",ans); return 0;
22 }

 

20160917

以上是关于bzoj1724[Usaco2006 Nov]Fence Repair 切割木板*的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1724: [Usaco2006 Nov]Fence Repair 切割木板

bzoj1724: [Usaco2006 Nov]Fence Repair 切割木板(贪心+堆)

bzoj1726[Usaco2006 Nov]Roadblocks第二短路*

[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排

[BZOJ] 1660: [Usaco2006 Nov]Bad Hair Day 乱发节

BZOJ 1660 [Usaco2006 Nov]Bad Hair Day 乱发节