10.6上课——problem1切割木板(USACO 2006 November Gold)
2015-10-06 20:44
316 查看
【问题描述】
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树求解
本人题解:
大神(NOIRP)思路:
优·先·队·列
(该段大神代码因为不是本人原创,所以只能用图片了,抱歉了各位)
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,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)思路:
优·先·队·列
(该段大神代码因为不是本人原创,所以只能用图片了,抱歉了各位)
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息