poj 3253 初涉二叉堆 模板题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 3253 初涉二叉堆 模板题相关的知识,希望对你有一定的参考价值。
这道题很久以前就做过了 当时是百度学习了优先队列
后来发现其实还有个用sort的办法
就是默认sort排序后 a[i]+=a[i-1]
然后sort(a+i,a+i+n) (大概可以这样...答案忘了...)
嗯...其实标准解法是二叉堆..
主函数里面的while里面wa了好多次..
每次都选最小的那俩相加 再放回去
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int h[20050]; int n; void chen(int i) { int t; while(i*2<=n) { t=i*2; if(t+1<=n) { if(h[t]>h[t+1]) { t++; } } if(h[i]>h[t]) { int x=h[t]; h[t]=h[i]; h[i]=x; i=t; } else break; } } int main(){ while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&h[i]); } for(int i=n/2;i>=1;i--) chen(i); long long int ans=0; while(n>1) { int minn=0; minn+=h[1]; h[1]=h[n]; n--; chen(1); minn+=h[1]; h[1]=minn; chen(1); ans+=minn; } printf("%I64d\n",ans); } }
以上是关于poj 3253 初涉二叉堆 模板题的主要内容,如果未能解决你的问题,请参考以下文章
《算法竞赛进阶指南》0x17二叉堆 POJ2442 矩阵取数求前N大