10.6上课——problem1切割木板(USACO 2006 November Gold)
来源:互联网 发布:淘宝赚钱助手是真的吗 编辑:程序博客网 时间:2024/05/29 04:53
【问题描述】
John 计划修理牧场的栅栏,为此他需要准备 N(1≤ N ≤20000)块特定 长度的木板。第 i 块木板的长度为 Li(1≤ Li ≤50000) 。John 买了一块很长 的木板,其长度正好等于所需要的 N 块木板长度总和。接下来当然要把它切割 开,假定切割木板的过程中没有任何损失。 切割一块木板的费用正比于木板的长度,比如,一块木板的长度为 21,那 么锯开它的费用就是 21 美分。John 可以自由的决定切割木板的顺序以及每次 切割的位置。很显然,按照不同的顺序切割木板最终的花费是完全不一样的,请 你帮助 John 计算出为了得到他所想要的木板,最少花费为多少?
【输入】
第一行一个整数 N,表示 John 需要的木板总数。接下来 N 行,每行一个整 数表示需要的木块长度。
【输出】
一个整数,表示 N-1 次切割的最小花费。
【样例输入】
3
8
5
8
【样例输出】
34
学习任务:
huffman树构建与维护
我的思路:
用堆模拟huffman树求解
本人题解:
#include<iostream>#include<cstdio>using namespace std;const int N=20005;int huff[N],n,n1=0;long long ans=0;void wh(int x,int y){ int temp; temp=huff[x]; huff[x]=huff[y]; huff[y]=temp;}int work(){ int temp=huff[1],k,j; huff[1]=huff[n1--]; j=1; while(j<=n1/2) { k=j*2; if(k<n1&&huff[k%2==1?k:k+1]<huff[k]) k++; if(huff[k]>=huff[j]) return temp; wh(j,k); j=k; } return temp;}int main(){ freopen("plank.in","r",stdin); freopen("plank.out","w",stdout); int x,i,j,first,second; cin>>n; for(i=1;i<=n;i++) { cin>>x; huff[++n1]=x; j=n1; while(j>1&&huff[j/2]>huff[j]) { wh(j,j/2); j/=2; } } for(i=1;i<n;i++) { first=work(); second=work(); huff[++n1]=first+second; j=n1; while(j>1&&huff[j/2]>huff[j]) { wh(j,j/2); j/=2; } ans+=first+second; } cout<<ans; return 0;}
大神(NOIRP)思路:
优·先·队·列
(该段大神代码因为不是本人原创,所以只能用图片了,抱歉了各位)
0 0
- 10.6上课——problem1切割木板(USACO 2006 November Gold)
- POJ3253[USACO 2006 November Gold]--Fence Repair
- [USACO 2006 November Gold] 玉米地Corn Fields
- problem1——2
- 047_木板切割问题(fence repair) poj 3253
- 077_木板切割问题(优先队列)
- poj3253切割木板(哈夫曼树) 贪心【优先队列】
- POJ 3259/USACO 2006 December Gold:Wormholes
- 【poj3259】Wormholes 【USACO 2006 December Gold】
- Unit3--problem1掌握对象——动向
- 【bzoj1724】[Usaco2006 Nov]Fence Repair切割木板
- [BZOJ1724][Usaco2006 Nov]Fence Repair 切割木板
- bzoj1724【Usaco2006 Nov】Fence Repair 切割木板
- 1724: [Usaco2006 Nov]Fence Repair 切割木板
- BZOJ1724: [Usaco2006 Nov]Fence Repair 切割木板
- 洛谷 2664_切割木板_堆
- bzoj1724[Usaco2006 Nov]Fence Repair 切割木板
- USACO2011 November Gold Above the Median
- 【Python】Learn Python the hard way, ex0 学习使用Terminal
- Linux join命令
- 【NDK开发】JNI与NDK关系
- Android Adapter以及getView()方法的理解
- 剑指offer:孩子们的游戏(圆圈中最后剩下的数)
- 10.6上课——problem1切割木板(USACO 2006 November Gold)
- HDU 4622 Reincarnation
- 【bzoj2750】【HAOI2012】【Road】【最短路+dp】
- FZU 1759 Super A^B mod C(数论+快速幂+欧拉函数)
- IOS 开发笔记——如何用 collection 创建瀑布流
- ES6详解六:赋值语法糖 destructing & spread
- 关于fragment、ActionBar与ViewPager的一些总结
- NUKE推荐的cybersecurityventures
- Crush The Crash--汇编级看函数调用