合并果子----(堆的应用)
2016-08-29 21:53
113 查看
合并果子人人皆知,然而这并不是DP,是可以每次选最小的就可以对,
but我直接暴力,神奇的TLE了!
于是乎,我用了堆
but我直接暴力,神奇的TLE了!
于是乎,我用了堆
#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; int d[100000]; //堆 int main() { int m,n,i,j,k,l; cin>>n; for(i=1;i<=n;i++) { cin>>d[i]; k=i; while(k>1 && d[k]<d[k/2]) //如果d[i]小于左子树,则往上浮 { swap(d[k],d[k/2]); //上浮过程 k=k/2; } } int len=n,ans=0; while(len>1) { int s=0,u; s+=d[1]; //取出最小值合并 d[1]=d[len--]; //填充堆顶 u=1; while(len>=u*2 && d[u]>d[u*2] ||len>=u*2+1 && d[u]>d[u*2+1]) //如果d[u]大于左子树,则像下沉,即调整堆 { int t=u*2; //下沉过程 if(d[u*2]>d[u*2+1]) t++; swap(d[u],d[t]); u=t; } s+=d[1]; //再取一次最小值 d[1]=d[len--]; //d[len+1]=0; u=1; while(len>=u*2 && d[u]>d[u*2] ||len>=u*2+1 && d[u]>d[u*2+1]) { int t=u*2; if(d[u*2]>d[u*2+1]) t++; swap(d[u],d[t]); u=t; } ans+=s; //合并果子后又放入堆中,最后剩下的即是解.... d[++len]=s; u=len; while(u>1 && d[u]<d[u/2]) { swap(d[u],d[u/2]); u=u/2; } } cout<<ans; //解 return 0; }
相关文章推荐
- 【二叉树】 堆应用:合并果子
- [luogu]P1090合并果子-插入排序的简单应用
- Git fetch pull 的应用, git 多人同时修改一个文件后的合并
- 合并果子
- awk 多行合并【next 使用介绍】(常见应用4)
- 合并果子 RQNOJ
- 合并果子
- 合并果子
- [一堆一堆又一堆]合并果子
- vlookup函数简单应用“合并计费”
- 【又拍图片相册跨分页下载图片/本地图片】合并及文字水印——淘宝开店过程中的技术应用【提供源代码下载】
- 邮件合并在打印学生信封上的应用
- 动态磁盘的应用-多硬盘合并成大分区
- httpmodule和httphandler配合的又一应用——合并脚本样式
- 应用场景:将员工不同的职位合并到同一列
- b151: NOIP2004 2.合并果子
- nutch应用-合并Crawl
- P1097合并果子解题报告
- 【原题】【noip 2004 T3】【数据结构】 合并果子
- 1327 合并果子