POJ 2251 Dungeon Master(BFS例题)
用STL的queue实现BFS,最基础的题目了,不多说上代码
1 |
|
用STL的queue实现BFS,最基础的题目了,不多说上代码
1 |
|
二叉树的重要的遍历序列有三种:先序遍历,中序遍历,后序遍历。其中中序遍历可以由其他两种遍历序列定位的根来划分出左右两棵子树,所以已知的两种遍历序列中必须有中序遍历。
示意图(先序+中序->后序)
对于先序遍历序列,树根一定是第一个元素(后序遍历的根则是最后一个),知道树根后在中序遍历中找到树根,则根前面的就是左子树,后面的就是右子树,再递归的对左右子树执行上述操作直到序列为空,输出序列就是另一种序列。对于求先序序列,每次都是找到树根就输出,而求后序序列时是先递归处理完左右子树后再输出根。
代码:
输入中序和后序,求先序
输入:
DBKFIAHEJCG
DKIFBHJEGCA
输出:
ABDFKICEHJG
1 |
|
输入中序和先序,求后序
输入:
DBKFIAHEJCG
ABDFKICEHJG
输出:
DKIFBHJEGCA
1 |
|
所谓堆,就是一棵完全二叉树,对于二叉树的任意一个节点node,它的左右孩子(如果有的话)都和node满足同一种关系,如都大于node(小根堆)或都小于node(大根堆),但是左右孩子之间的关系没有要求。通常用数组来实现一个堆,对于每一个节点,它的下标2就是左孩子(如果有的话),左孩子下标再加一就是右孩子(如果有的话),操作起来很方便。堆的构造是每插入一个元素都对元素进行适当的上浮调整,使之满足堆的条件,时间复杂度为O(nlogn)。如果每次删除堆顶并输出,并将堆的最后一个元素移到堆顶后再对其进行下沉调整重新形成一个堆,循环操作直到堆为空,那么最后输出的序列一定是有序的,这就是堆排序。
1 | /* |
测试数据:15 1 2 9 8 7 6 3 11 13 5 12 4 10 14
输出结果:
1 | 1 |
哈夫曼思想,优先队列解决
手打版
就把上一篇堆的代码做了点改动
1 | /* |
STL偷懒版
1 | /* |
题目大意:
一个人要去钓鱼,可用时间为h(小时),可选湖泊为n个,可以将湖泊看成在一条直线上的顺序的n个点,要去第k个点必须从第k-1个点出发,所用时间为t[k-1](个5分钟),每个湖初始鱼的数目为f[i](注意,可能为0),每个湖泊单位时间(五分钟)鱼的数目减少d[i]条(这是人在该湖泊钓鱼的情况下,人不在就不会减少),问h时间内他能钓的鱼最多是多少?
题目分析:
贪心策略,先找到他能到达的最远的(所有时间用来跑路的极限值)湖泊p,然后分为若干种情况:他的活动范围是 11 、 12 、 ······· 1p,即他可以选择的跑去钓鱼的最远的湖泊有p个,枚举每种情况,把总时间减去跑路的时间就是他能钓鱼的时间,在情况 1k 时,对于每一个单位时间(五分钟),都从1到k枚举每个湖泊找到最大值记录相应位置,然后每种情况都算一次,迭代出最大值就可以了。
1 | /* |
所谓单调队列,就是支持从队尾插入删除,队头查询的一种数据结构,虽然用途不是很广泛,但是对于某些问题如:在一个被不断刷新的缓存区中多次查询最小值(最大值)非常高效
构造方法:对于单调上升队列:每次从队尾入队一个元素,都从队尾起依次删除比当前元素大的元素,强制使队列单调
示例,POJ 2823 Sliding Window
1 | /* |