随笔分类 -  数据结构

Ordered Fractions(二叉搜索树)
摘要:题意:输入一个n,按从小到大的顺序输出从0到1之间的所有分母不大于n的最简分数。比较容易想到的是排序。可以用结构体表示一个分数,将所有符合条件的分数都存到数组里,然后sort一下,输出就行。注意cmp函数的写法bool cmp(node x,node y) { return x.a*y.b<x.b*y.a; //比较两个分数的大小,交叉相乘 }最近刚学了二叉树,可以用二叉查找树,实现插入排序。0/1和1/1这两个值只能逼近不能达到,直接输出即可。根据二叉查找树的性质,显然1/2是该树的head。然后分子分母从小到大,往树里进行插入。如果发现树中已有相同的值,说明该分数不是最简,而且已经有 阅读全文
posted @ 2012-11-18 23:41 MicZ 阅读(241) 评论(0) 推荐(0)
HOJ 1225 Suptermarket(并查集)
摘要:题意:先给出商品个数n,然后对于每一个商品ai{pa,da},pa代表这个商品的利润,da代表这个商品必须在第d天之前售出. 每天只能卖出一个商品问如何安排卖的顺序,使得利润最大.输出最大利润分析:根据贪心的策略,按利润排序,利润最大的放在最前面.按ddl分集合ddl=1的集合,只能在0~1的时间卖.ddl!=1的集合,除了在ddl那天卖,还能在ddl之前的某一天卖,所以将ddl的商品,做成ddl-1的商品的子树.#include <iostream> //按deadline进行分集合 #include <cstdio> #include <memory.h> 阅读全文
posted @ 2012-10-21 15:53 MicZ 阅读(341) 评论(0) 推荐(0)
线段树基本应用——区间最值查询
摘要:感觉对线段树快有阴影了。。还是先从最简单的开始吧。关键是理解原理。求区间最小值:题目:2 //testcases5 3 //n:数组元素个数,m:查询次数78 1 22 12 3 //输入数组,每个数最大值不超过10^51 2 //查询从l到r上的最小值3 54 4#include <cstdio> #include <algorithm> #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 using namespace std; const int maxn = 阅读全文
posted @ 2012-10-06 09:43 MicZ 阅读(223) 评论(0) 推荐(0)
HOJ 2275 Number sequence(树状数组)
摘要:题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai < Aj > Ak 且 i < j < k这样的三个数为一组。求出一共有多少组。分析:n最大可达50000,常规的暴力枚举的话,复杂度为O(n^2),1s的时限肯定会超时。考虑树状数组:树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,能快速地获取连续几个数的和。令num[i]做c[]的下标,来检索树状数组对于本题数列中每输入一个元素num[i],就在树状数组num[i]位置,即c[num[i]]加1,表示这里有一个数。这样,sum(num[i]-1) ,即c[1]+c[2]+...... 阅读全文
posted @ 2012-10-03 16:38 MicZ 阅读(154) 评论(0) 推荐(0)
关于优先级队列STL
摘要:STL之priority_queue【转】STL之priority_queue【转】STL之优先队列原本以为priority_queue很简单,才知道原来懂的只是最简单的形式。头文件:#include<queue>优先队列,也就是原来我们学过的堆,按照自己定义的优先级出队时。默认情况下底层是以Vector实现的heap。既然是队列,也就只有入队、出队、判空、大小的操作,并不具备查找功能。函数列表:empty() 如果优先队列为空,则返回真pop() 删除第一个元素push() 加入一个元素size() 返回优先队列中拥有的元素的个数top() 返回优先队列中有最高优先级的元素用途就 阅读全文
posted @ 2012-08-28 16:30 MicZ 阅读(252) 评论(0) 推荐(0)
HOJ 1898 Babelfish(Trie树)
摘要:题意就是先输入一个字典: 目标字符串-----输入字符串然后输入一个字符串,在上面的对应关系中进行查找,如果有则输出目标字符串,没有则输出eh。如果不想超时的话,明显就要套字典树了。代码贴上来,留作模板。字典树还是挺简单易懂的嘛。。。#include <iostream> #include <cstdio> #include <cstring> #include <memory.h> using namespace std; const int num_char=26; struct TrieNode { TrieNode* branch[num 阅读全文
posted @ 2012-08-27 22:26 MicZ 阅读(117) 评论(0) 推荐(0)
HOJ 1456 Team Queue(用queue进行模拟)
摘要:这题用的是queue,还有用了map实现将不同的人分到若干组。queue里的元素还是queue,这样就能实现插队的功能了,直接在特定的queue后面push即可。这里还用了一个bool型的visit数组,用来记录这一个team中是否有人已经在队列里。如果有,直接在对应的queue后面push一个新member。如果没有,说明这个member是他们team里面第一个来排队的,直接把他push在队尾即可。总之,在排队的不是一个人,而一个team。#include <iostream> #include<cstdio> #include <map> #includ 阅读全文
posted @ 2012-08-24 16:32 MicZ 阅读(322) 评论(0) 推荐(0)