随笔分类 -  OJ

做些题。。
摘要:第一题,列车调度(train) 在这个题目中,模拟压栈出栈,同时判断调度方案是否可行。 第二题,隧道(Tunel),通过95% 这道题的关键在于如何在O(1)时间内获取队列中的最大值。提示见邓俊辉老师的数据结构习题解答讲义。 第三题,真二叉树重构(Rebuild),通过95% 提示: 阅读全文
posted @ 2015-04-30 01:06 简单地快乐 阅读(309) 评论(0) 推荐(0) 编辑
摘要:大家在参加ACM比赛或者参加c/c++实验技能竞赛的时候,如果遇到大量的输入和大量的输出时,调试起来很不方便。一来如果结果不正确的话,需要重复输入大量数据;二来如果大量输出的话,得仔细检查输出结果与正确答案是否一样。这两项任务有时让人很不舒服。 我们可以利用freopen()函数来重定向流,可以使调试起来更加简单方便。 一个简单的例子:#include #include using namespace std; int main() { int a; int b; freopen("in.txt", "r", stdin); freo... 阅读全文
posted @ 2014-04-04 17:02 简单地快乐 阅读(429) 评论(0) 推荐(0) 编辑
摘要:这个题,我愣是看了好久都没理解,上网查了一下,仔细一想,小记于此。题目:若以 1234 作为双端队列的输入序列,试分别求出满足以下条件的输出序列:(1) 能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列;答案:4132(2) 能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列;答案:4213(3) 既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。答案:4231初见此题,感觉没有思路。看了答案之后,感觉怎么会只有一个答案呢?而且为什么都是4先出队列的呢?引用严蔚敏自己的解答:双端队列确是好像两个栈底靠在一起的栈,但这两个栈底又是互通 阅读全文
posted @ 2013-09-22 14:59 简单地快乐 阅读(1112) 评论(0) 推荐(1) 编辑
摘要:任意一个正整数都可以用2的幂次方表示,例如:137=2^7+2^3+2^0,同时约定次方用括号来表示,即a^b=a(b)。由此可知,137可表 示:2(7)+2(3)+2(0)。进一步:7=2^2+2+2^0(2^1用2表示),3=2+2^0。所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)。 注:2的1次用2表示,按2的次幂降次排序 这个题目设计到递归、位运算,虽然代码很简单,但是思路还是值得思考一下。#include <stdio.h>int DG(int n) { int i,a[16],p=0; for (i=... 阅读全文
posted @ 2013-04-14 01:10 简单地快乐 阅读(3709) 评论(0) 推荐(0) 编辑
摘要:题目如下:按照原理,编程实现1□2□3□4□5□6□7□8□9□10=100。在□中插入+或-,不插入则表示连接,使得最终运算结果等100 做这个题,自己用了栈+回溯法。题目虽然挺简单,但是实现起来,还是出了不少错误。不多说,附代码: 1 #include <iostream> 2 using namespace std; 3 4 #define add 30 //加法 5 #define sub 31 //减法 6 #define blank 32 //连接 7 #define ex 33 //在运算符栈中最先压的元素,优先级最低 8 9 char ... 阅读全文
posted @ 2013-03-06 17:58 简单地快乐 阅读(555) 评论(0) 推荐(0) 编辑
摘要:这是一道比较经典的动态规划的例题,感觉思路挺巧。这里有一篇不错的文章,可以看一下: http://blog.csdn.net/piaoyi0208/article/details/7728972 还有关于动态规划入门的一篇文章:http://blog.csdn.net/jqandjq/article/details/5060283 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int n,i,j,k,l,i_max; 5 int array[101][101],sum[101]; 阅读全文
posted @ 2013-01-21 13:50 简单地快乐 阅读(209) 评论(0) 推荐(0) 编辑
摘要:这是一道20进制相加的习题,关键点在于把字母与数之间的转换,巧妙地利用strchr函数可以进行转换。下面是有位师兄写的吧,代码清晰,很容易看懂。 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char* NUMS="0123456789abcdefghij"; 5 6 /*分别是读取的输入行,加数a,b,计算结果c */ 7 char line[105],a[105],b[105],c[105]; 8 9 /*字符换算为实际数值,例如'a'-&g 阅读全文
posted @ 2013-01-20 21:48 简单地快乐 阅读(268) 评论(0) 推荐(0) 编辑
摘要:这道题目是多项式相乘、求模。。按照题目中的规则,可以看出,多项式的加法和减法是相同的结果,那么多项式的除法都可以用加法来计算了。代码的重点是21到24行,36到37行,是如何实现乘和求余的步骤。 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 #define MAXN 2000 5 struct poly{ int deg,x[MAXN];}; 6 void print(poly f) 7 { 8 cout<<f.deg<<' '; 9 for 阅读全文
posted @ 2013-01-20 20:46 简单地快乐 阅读(294) 评论(0) 推荐(0) 编辑
摘要:这是一道关于博弈论的题目,并不是很难,但是由于没有接触过,感觉还是无从下手,下面记录下这道题目。 (引用别人的)第一个必败状态是2001.11.04。由此可以推出其他任何时间的状态。对于除2001.11.04外的其他任何时间,present状态是由能移动到的下两个next状态决定的(当然有些时间只有一个next状态),比如1924.12.19的状态是由1924.12.20和1925.01.19两个状态决定。如果两个next状态中有一个必败状态,则present状态为必胜状态;如果两个next状态都为必胜状态,则present状态为必败状态。 下面是代码,代码中的date为第一个必败态,依次推. 阅读全文
posted @ 2013-01-19 13:45 简单地快乐 阅读(506) 评论(0) 推荐(0) 编辑
摘要:这是一个比直接深搜要发杂点的题,自己刚开始做的时候,思路并不是很清晰,查找了一些相关解答后,顺利弄懂,这里的代码并非我写的,是csdn上一个朋友写的,不错,我只是稍微添加注释。可以注意的是47到51行,55,56行。 1 #include <iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define maxnum 26 6 typedef struct{ 7 int l,r,u,d; 8 }data; 9 data squares[maxnum];//sq 阅读全文
posted @ 2013-01-17 12:06 简单地快乐 阅读(715) 评论(0) 推荐(0) 编辑
摘要:继续小结,做到一道求 哈希表查找成功与查找不成功 情况下平均查找长度的计算问题,迷惑了好一会,在这里总结下来: 首先,你要明白的是平均查找长度求的是期望,那么你就按照求期望的方法来求平均查找长度吧,千万记着期望怎么求平均查找长度就怎么求啊。 题目:在地址空间为0~16的散列区中,对以下关键字序列构造两个哈希表:{Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec}(1) 用线性探测开放地址法处理冲突;(2) 用链地址法(开散列存储)处理冲突 并分别求这两个哈希表在等概率情况下查找成功和查找不成功时的平均查找长度。设哈希函数. 阅读全文
posted @ 2012-12-16 22:24 简单地快乐 阅读(40293) 评论(1) 推荐(4) 编辑
摘要:在看二叉排序树查找分析时,对“二叉排序树查找不成功的平均查找长度”不是很理解,上网查了一下,稍微小结一下: 假如一棵二叉排序树如下:那么查找不成功的平均查找长度是:(2*2+3*3+4*2)/7=21/7比如说一个数如果比62<x<74,那他应该是在74左接点,但是现在74左接点不存在,所以查找不成功,那么就是查找了2次。 你再查找x>74的接点,他应该是在74右接点上,但是不存在,也是两次。所以由于74左右孩子不存在,查找62<x<74和x>74的总次数是2*2 15的左右孩子不存在,当查找x<15和15<x<30查找的次数是2*3,56 阅读全文
posted @ 2012-12-16 14:28 简单地快乐 阅读(22742) 评论(1) 推荐(2) 编辑
摘要:继续小结: 树向二叉树的转换,树的根节点还是二叉树的根节点,根的子树森林构成一棵树二叉树作为根节点的左子树。 二叉树向树的转换则需要一些条件,这个条件是什么呢?就是这颗二叉树没有右子树。要明白一点,右子树都是兄弟,左子树都是孩子(左子右兄)。同时也能知道如果树用二叉链表存储的话,如果结点没有左子树则意味着其没有孩子,则意味这其是叶子节点。 森林向二叉树的转换,二叉树的根节点是第一棵子树的根节点,第一棵子树的子树森林构成一棵二叉树作为根节点的左子树,其余的树(也就是森林中除了第一棵树外其他的树)构成一棵二叉树,作为根节点的右子树。 二叉树向森林的转换,二叉树的根和其右子树转换成第一棵树。(这个. 阅读全文
posted @ 2012-12-15 21:55 简单地快乐 阅读(2066) 评论(0) 推荐(0) 编辑
摘要:最近复习一下数据结构,又加深了一些问题的理解。 递归大家都很熟悉了,但是什么时候能用递归?什么时候不能用递归呢?大家在学习汉诺塔、二叉树和树的时候经常用到递归,但是为什么这些时候能用递归,而其他时候不能用到递归呢? 递归的使用就是知道递归的次数是可知的并且是恒定的(这里的次数并不是递归的深度,举个例子吧,遍历二叉树的根节点后,你明确的知道要遍历左子树和右子树,那么这里的次数就是2,2是已知的并且不会随节点的变化而变化),在二叉树中,仅仅有左子树和右子树两种情况,所以能用递归。 可能有人又会问了,我也见过数的遍历中用到递归的啊,这个每个节点的孩子数目是不一定的啊,这又怎么解释呢?我可以说,这种. 阅读全文
posted @ 2012-12-15 21:28 简单地快乐 阅读(450) 评论(0) 推荐(0) 编辑
摘要:这是一道bfs的习题,比较经典,以前也没做过bfs的题,第一次做,记录下思路。 首先,应该弄明白的是BFS要通过队列来实现,我向来不喜欢做题时自己再将什么声明队列,出队列,入队列的函数给写出来,感觉有点麻烦。这次我才发现有queue、stack的这种头文件,可以直接使用。第一步将起点位置加入队列,如果当队列为空还没有访问到目标位置就代表访问不到目标位置了。 其次,这道题求的是最少的步数,一旦搜索到目标位置,就立马停止搜索,输出步数。那么这个步数怎么来算呢??如何避免访问已经访问过的位置呢??这里建立一个二维数组,存放每一个位置的状态,-1表示没有访问过,其他的值代表访问这个位置的时候已经走过. 阅读全文
posted @ 2012-11-18 14:07 简单地快乐 阅读(465) 评论(0) 推荐(0) 编辑
摘要:这道题也是一道最短路径的题目。用的是Floyd算法。下面简述一下自己做这道题的过程。 首先,要对Floyd算法理解清楚。Floyd算法可以求出的是任意两点之间的最短路径,注意这里是任意,所以可用一个邻接矩阵来表示各点到各点的最短路径。它的基本思想是在Vi到Vj的所有路径中找出一条长度最小的。那么如何有效的找出这一条最短的呢??<Vi,Vj>代表从Vi直接到Vj,那么<Vi,Vj>要么是一条弧的值,要么是一个无穷大的值(即这两点之间没有直接连接的弧)。我们依次在<Vi,Vj>之间插入V1到Vn,首先从V1开始,那么从Vi到Vj的最短路径可能要经过V1,所以此时 阅读全文
posted @ 2012-11-17 23:08 简单地快乐 阅读(310) 评论(0) 推荐(0) 编辑
摘要:做这道题的时候,自己恰好刚看过dijstra算法。不过感觉有些地方还是不是那么好处理?去网上看了一下,大家好像说这个题很简单,就感觉自己太菜了。下面写下自己做这个题的过程。 首先,我要解决的是要存储消防站到火点的路径,并且是存储多个消防站到火点的路径,这个该怎么存储呢?此外,我要存储多个消防站到火点所用的时间,这个该怎么存储呢?还有,怎么根据输入消防站的个数不同来输出呢?这些都成为了我的困扰。 后来看了网上的代码,感觉对我帮助很大。 一、我用不用存储每个消防站到火点的路线呢?不用!!我只要将到达该点的最短路径的前驱存储就行了,用不着再用什么二维数组来存储消防站到火点的距离。举个例子,消防站标. 阅读全文
posted @ 2012-11-17 15:48 简单地快乐 阅读(253) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示