11 2010 档案

摘要:某日,老师在课堂上想考考学生们的智商,就问一个男孩: “树上有十只鸟,开枪打死一只,还剩几只?” 男孩反问:“是无声手*枪,还是其他没有声音的枪么?” “不是.” “枪声有多大?” “80~100分贝.” “那就是说会震的耳朵疼?” “是.” “在这个城市里打鸟犯不犯法?” ‘不犯.” “您确定那只鸟真的被打死啦?” “确定.”老师已经不耐烦了,”拜托,你告诉我还剩几只就行了,OK?” “OK.鸟... 阅读全文
posted @ 2010-11-29 19:12 Allen Sun 阅读(720) 评论(0) 推荐(1)
摘要:  http://poj.org/problem?id=3750   方法: 1012类似,但稍复杂 约瑟夫环问题:三个参数————人数n,开始人的号start,数到step出队一人 此问题一般有两种形式(这里都给了实现) 1、求出队顺序:利用数组或循环链表模拟出队过程,复杂度为O(step*n)      技巧:循环链表实现时... 阅读全文
posted @ 2010-11-09 20:06 Allen Sun 阅读(847) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3748   方法: 给定16进制32bit数,将其第x位置0,第y位开始的三位置成110 注意考虑待置位数中有a~f的情况   Description 假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(... 阅读全文
posted @ 2010-11-09 20:01 Allen Sun 阅读(528) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3630   方法一: 利用Trie可以很好的解决此类前缀问题。它有一个很大的好处就是可以边插入边判断是否是前缀。 由于号码只由0~9组合,因此Trie的数组分支也为10个,即son[10](就像当英文字典时为son[26])。 一般而言Trie的节点都在需要时被new出来,但这样无疑会浪费太多的时间。因此我们可以... 阅读全文
posted @ 2010-11-08 19:59 Allen Sun 阅读(430) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3517   方法:具体参见3750 假设此环为以m+1起始,m-1终止的n-1环,且m+1--->1,求得此环最后出队的编号 再将此编号转换成原n环的编号 注意: 此题m为起始点,k为步长。且首先出队编号m,再以步长k循环 Description Let’s play a stone removing g... 阅读全文
posted @ 2010-11-08 19:56 Allen Sun 阅读(333) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3414   方法: 该题简化之后即为求从初始状态(0,0)到终止状态(i,C)或(C,j)的最短路径 对于每个状态(i,j)存在由6种操作得到的6个邻接状态,即为图中的邻接节点 将每种操作和得到的节点状态对应上以便打印路径,即pathArr[6]和adjVertex[6]   Description ... 阅读全文
posted @ 2010-11-08 19:53 Allen Sun 阅读(457) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3321 方法: 该题要经常查询数值总是变化的区间和。 如果采取常规做法求得积累数组c[N],那么当a[i]改变时,同时需要改变c[i...N],使得每次调整都会很慢,复杂度O(N)。求和复杂度O(1) 树状数组BIT形状很像二项树,适用于对经常改变的数组快速求得区间和。 采用树状数组tree[N]的话,每次调整与求和的复杂度为O... 阅读全文
posted @ 2010-11-08 19:50 Allen Sun 阅读(522) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3278   方法: 单源无权图最短距离,即BFS 该问题只需要求得某两点间的最短距离,所以不必求得所有节点的最短距离,一旦处理了目的地点,即可返回结果   Description Farmer John has been informed of the location of a fugitive ... 阅读全文
posted @ 2010-11-08 19:46 Allen Sun 阅读(335) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3210   方法: 当n个硬币初始同面,则只能偶次翻转才能保持同面,所以答案肯定是偶数。 n为偶数时,假设1个为正,n-1个为反,两中情况同为奇数,所以只能通过奇数次翻转才能保持同面,    这与上面的情况矛盾,所以n为偶数时无解 n为奇数时,正反的个数必然是一个偶数一个奇数。假设1个为正,n-... 阅读全文
posted @ 2010-11-08 19:43 Allen Sun 阅读(419) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3176   方法: DP:将大问题转化为小问题解决。由递归写循环。 c[i][j]表示从a[1][1]开始到a[i][j]的最大和。而最终的结果为c[n][1...n]中的最大值 递归式为: c[1][1] = a[1][1] c[i][j] = max{ c[i-1][j-1], c[i-1][j] } + a[... 阅读全文
posted @ 2010-11-08 19:41 Allen Sun 阅读(290) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3126 方法: 先筛出1000~9999的所有素数,对于其中每个素数求得他在图中的邻接点。其邻接点就是所有与其有一位不同的素数。 再用BFS搜索图找到指定源节点和目标节点之间的最短路径。若不联通则输出失败   Description The ministers of the cabinet were quite ... 阅读全文
posted @ 2010-11-08 19:38 Allen Sun 阅读(417) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3087   简单的模拟题,模拟洗牌   Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by sta... 阅读全文
posted @ 2010-11-08 19:35 Allen Sun 阅读(276) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3080   方法: 将第一个字符串的所有子串枚举为pattern,匹配其他所有的字符串,找到与所有匹配的最大子串 匹配用KMP,注意到当不同pattern前缀相同时,预处理不必从头做起,因为每个next[i]之于其之前的next有关   Description The Genographic Pro... 阅读全文
posted @ 2010-11-08 19:33 Allen Sun 阅读(418) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3070 方法: divide and conquer,类似于求幂 矩阵求幂 复杂度:O(logn) | F(n+1) F(n)   | = | 1  1 |^n | F(n)   F(n-1) |   | 1  0 |   注意: 矩阵... 阅读全文
posted @ 2010-11-08 19:30 Allen Sun 阅读(532) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=3067 方法: 求交点个数,我们可以将其转化为求逆序数问题。 两线段(x1,y1)、(x2,y2)相交当且仅当(x1-x2)*(y1-y2)<0 对所有输入线段按x排序,对同x的线段按y排序。利用排序后的输入计算逆序数。 数组元素a[i]记录y为i的线段的个数。依次读入排序后的线段,每取一个y值,++a[y],并计算 区间... 阅读全文
posted @ 2010-11-08 19:27 Allen Sun 阅读(316) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2739   方法: 埃氏筛法得到N以下的所有素数,复杂度n*lglgn 利用积累数组计算数组中连续元素的和   Description Some positive integers can be represented by a sum of one or more consecutive prim... 阅读全文
posted @ 2010-11-08 19:24 Allen Sun 阅读(586) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2593   Maximum Sequence 求数组两段不重叠的连续子数组的最大和 详见2479   Description Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N). You should outpu... 阅读全文
posted @ 2010-11-08 19:20 Allen Sun 阅读(274) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2499 root为(1,1),节点(a,b)的左孩子为(a+b,b),右孩子为(a,a+b)。求从root到给定节点(a,b)所走过的左右路径各为多少 方法:不断优化算法的经典例子,类似于求最大公约数TLE了几次才逐渐改进的算法:TLE-->0ms详见注释 Description BackgroundBinary trees are a... 阅读全文
posted @ 2010-11-08 19:17 Allen Sun 阅读(1087) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2479 方法:两次dp+一次扫描,复杂度3*n 基于求最大连续子数组的线性dp算法 对数组从前往后各做一次O(n)的dp,求得maxsofar[0][0...n-1],再数组从后往前各做一次O(n)的dp,求得maxsofar[1][0...n-1], 再扫描一遍maxsofar求得maxsofar[0][i-1] + maxs... 阅读全文
posted @ 2010-11-05 19:45 Allen Sun 阅读(777) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2388   方法: 找中位数 一般来讲当数不是很多时可使用patition的方法,复杂度n 这里的方法适用于大量数据的情况,此时内存无法放下所有数。通过扫描大概lgn次数据即可找到中位数,复杂度nlgn 利用了中位数的性质:其左右两边的数据量相同   Description FJ is survey... 阅读全文
posted @ 2010-11-05 19:30 Allen Sun 阅读(609) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2352   方法:复杂度N*O(log Max) 树状数组Binary Indexed Tree,具体见3321 求得常变二维平面上(0,0)到(x,y)所形成的矩形中点的个数 由于内存限制,所以只能考虑用一维的BIT来解决此问题。因此需要将输入数据先按y排序,再对 同y的x排序,对这样排序好的数据依次进行处理... 阅读全文
posted @ 2010-11-05 19:26 Allen Sun 阅读(423) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2299   方法: 利用merge sort求逆序数,复杂度nlgn 如果比较每一对儿数(或使用bubble sort),复杂度为n^2,太慢 对于一对儿逆序对儿,有三种情况:两数都在数组左半边,两数都在数组右半边,两数分别在左右两个半边。 由于Merge时两个半边都为sorted,所以只会出现第三种情况。 计算... 阅读全文
posted @ 2010-11-05 19:22 Allen Sun 阅读(367) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2262   方法: 首先筛得1000000以下的素数表,复杂度N*lglgN 再用测试值减去素数表中从小到大的值,判断如果该值是素数,则不需要再接着找了,直接输出。复杂度N 注意点: 1、由于N很大,所以筛素数在计算i*i时可能会超过int的范围,所以需要采用__int64 2、需要符合要求的a,b使得a+b=c的... 阅读全文
posted @ 2010-11-05 19:19 Allen Sun 阅读(362) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2255   方法: 根据preorder和inorder构造postorder 例如preorder:DBACEGF   inorder:ABCDEFG            ... 阅读全文
posted @ 2010-11-05 19:16 Allen Sun 阅读(563) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2159   题意万岁:判断两数组a、b中的所有数是否一样(一个数组是另一个数组的排列) 两种方法:     1、可以先排序再依次判断两数组元素,复杂度nlgn+n     2、由于此题中每个字符串的长度最大为100,则数组中的每个元素都不会超过100,那么... 阅读全文
posted @ 2010-11-05 18:23 Allen Sun 阅读(412) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2155   题目要求修改一个区域,然后求一个元素的值。貌似和树状数组的功能完全相反。但这题,应该 说这个思路的精妙之处就体现在这里。我认为关键是要理解“树状”的概念。画一个一维的树状数 组图形,就会发现所有的元素都会链接到2,4,8,16,32……这条“主干”上来。那么,修改了“主干”, 其实就相当于修改了整个“树... 阅读全文
posted @ 2010-11-05 16:59 Allen Sun 阅读(656) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=2104 方法: 1、划分树,是平衡树:数组排序nlgn,建树nlgn,m次查询mlgn,总复杂度为O(nlgn+mlgn)      划分树就是利用类似线段树的树型结构记录划分元素(最终排序)的过程。      划分树是一种树形结构的二维数组,由四个... 阅读全文
posted @ 2010-11-05 16:55 Allen Sun 阅读(720) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1611 方法: 由于需要求得0元素所在划分的元素数,所以采用union by size的方法 将所有等价元素union到一起,然后再输出0元素所在划分的元素数 注意: union时需要事先判定两元素是否已经在同一个划分中,不然会出错 Description Severe acute respiratory syndrome (... 阅读全文
posted @ 2010-11-05 16:47 Allen Sun 阅读(312) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1606 方法: 该题简化之后即为求从初始状态(0,0)到终止状态(i,C)的最短路径 对于每个状态(i,j)存在由6种操作得到的6个邻接状态,即为图中的邻接节点 将每种操作和得到的节点状态对应上以便打印路径,即pathArr[6]和adjVertex[6] 注意: 此题的input无终止条件,所以一定要在scanf后面加上!=E... 阅读全文
posted @ 2010-11-05 16:45 Allen Sun 阅读(445) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1503   方法: 很简单,模拟手动加法过程, 结果中的前置0要消去   Description One of the first users of BIT's new supercomputer was Chip Diller. He extended his exploration of pow... 阅读全文
posted @ 2010-11-05 16:40 Allen Sun 阅读(376) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1426 方法: 找到n的倍数m,m中只能有0或1 0,1可构造出二叉树进行BFS搜索 该题的重点就在于如何构造出BFS进行搜索。 所有0,1组成的数可以构造出一颗二叉树从而进行BFS。每层的数字长度相同,每个节点的左右孩子为其末尾分别添加0,1 BFS搜索一颗二叉树。二叉树的节点按层序遍历依次为(1),(10,11),(100,... 阅读全文
posted @ 2010-11-05 16:37 Allen Sun 阅读(695) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1308 方法: 给定一些节点和对应边,判断他们所形成的图是否是树 技巧:类似于“并查集”的表示方法来表示树的结构 tree[1...49]初始为0。tree[i]表示i的父节点。 isNode[1...49]记录哪些编号的节点出现在图中 依次读入父节点p、子节点c和对应边,将isNode[p]和isNode[c]置位1,并赋值... 阅读全文
posted @ 2010-11-05 16:31 Allen Sun 阅读(577) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1195   方法: 简单的2D树状数组的应用 树状数组BIT形状很像二项树,适用于对经常改变的数组快速求得区间和。 采用树状数组tree[N]的话,每次调整与求和的复杂度为O(logN),效率大大提高。 介绍BIT的好文 http://www.topcoder.com/tc?module=Static&... 阅读全文
posted @ 2010-11-05 16:22 Allen Sun 阅读(341) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1163   方法: DP:将大问题转化为小问题解决。由递归写循环。 c[i][j]表示从a[1][1]开始到a[i][j]的最大和。而最终的结果为c[n][1...n]中的最大值 递归式为: c[1][1] = a[1][1] c[i][j] = max{ c[i-1][j-1], c[i-1][j] } + a[... 阅读全文
posted @ 2010-11-05 16:14 Allen Sun 阅读(451) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1159 方法1: c[i][j]表示:s[i...j]子字符串中最少需要插入多少个字符形成回文 c[1][n]为最终结果 初始值: c[i][i] = 0 c[i][j] = 0,if i>j 递归式: c[i][j] = c[i+1][j-1],if s[i]==s[j]     ... 阅读全文
posted @ 2010-11-05 16:10 Allen Sun 阅读(1071) 评论(0) 推荐(2)
摘要:  http://poj.org/problem?id=1157   方法: c[i][j]:一共i束花,j个花瓶时的最大值。 初始化: c[1][1] = a[1][1] c[i][i] = c[i-1][i-1]+a[i][i] 递归式: c[i][j] = max{ c[i][j-1], c[i-1][j-1]+a[i][j] }   Descri... 阅读全文
posted @ 2010-11-05 15:37 Allen Sun 阅读(307) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1007 求逆序数的方法: 1、此题每个string只有4种字母,所以可以用类似counting sort的方法来以逆序扫描字符串,并以a[1...3]记录相应字符串组的个数,计算每位数与其后面几位的逆序数。复杂度n。但输入若没有限制就不能靠a[1...3]这样做了,那样的话可能每扫描一个字符++的数组位很多,需要判断的分支也很多... 阅读全文
posted @ 2010-11-05 14:36 Allen Sun 阅读(405) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1141   方法: 对角线方向求解DP。 设c[i][j]表示原串str[i...j]补齐后的最短长度。a[i][j]表示原串str[i...j]补齐后的字符串。 c[1][n]和a[1][n]即为所求结果。n为原串的长度。   初始状态: c[i][i] = 2 a[i][i] = "()&q... 阅读全文
posted @ 2010-11-04 21:43 Allen Sun 阅读(418) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1094   方法: 每加入一条边就进行一次拓扑排序,从而找到符合条件的最少边数 拓扑排序的基本思想就是依次找到图中入度为0的节点,将该节点和其对应的边删除,这样就使得它的邻接节点的入度-1。反复循环这样做直到所有节点都从图中删除(都被编上拓扑编号),或者因为有环所以还剩下某些节点未被删除   Desc... 阅读全文
posted @ 2010-11-04 21:39 Allen Sun 阅读(334) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1088 方法: 如果递归式易得,但初始条件以及算法过程不好分析,以至于循环DP不好写的话,则可以采用递归+记忆 的方法实现DP c[i][j]:从(i,j)开始的最长路径 c[i][j] = max{ c[i-1][j], c[i+1][j], c[i][j-1], c[i][j+1] , 0 } +1   Desc... 阅读全文
posted @ 2010-11-04 21:34 Allen Sun 阅读(629) 评论(2) 推荐(0)
摘要:  http://poj.org/problem?id=1083   方法: 将所有房间号分为200段,即数组path[201],将每次需要移动的起始和目的地之间的所有path[i]都加1 找出path[1...N-1]中最大的一个,即最大的某路段重叠数,就是需要的趟数,再乘以10即得结果 注意点: 1.由于奇偶数分列两边,所以需要将奇偶数房间号做一下变换:  ... 阅读全文
posted @ 2010-11-04 21:29 Allen Sun 阅读(522) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1062 方法: 枚举+dijkstra 难点在于将问题具体化为求最短路的问题。将每个物品视为编号2~n的节点,编号为1的节点为酋长 的要求,编号为0的节点为旅行家。图中的边(u,v)表示由u到v所需要花费的金钱。所以(0,1)为酋 长的初始要求,(0,2~n)为每个物品本身的价格。若物品v可以用u加上花费c来代替,那么(u,v)... 阅读全文
posted @ 2010-11-04 21:25 Allen Sun 阅读(372) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1056   方法:Trie树 1、由于编码只由0、1组合,因此Trie的数组分支为2个,即son[2] 2、估计节点数目。已知一个集合中最多有8个序列,每个序列最多有10位。因此最坏情况下共有节点80个。   Description An encoding of a set of symbols ... 阅读全文
posted @ 2010-11-04 21:21 Allen Sun 阅读(416) 评论(0) 推荐(0)
摘要:  http://poj.org/problem?id=1050 方法:二维转一维 1、使用积累数组cumarr[1...n][1...n],使得求任意块儿子矩阵和的复杂度为O(1),cumarr[i][j]为cumarr[1...i][1...j]子矩阵的和,     通过cumarr[i][j]=cumarr[i-1][j]+cumarr[i][j-1... 阅读全文
posted @ 2010-11-04 21:17 Allen Sun 阅读(501) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1035   方法一:动态规划  O(len^2) EditDist c[i,j]表示s1[0...i]和s2[0...j]的编辑距离,由于矩阵c的第一行和第一列为基准情况,所以实际中c[len1,len2]为s1和s2的编辑距离 当s1[i]==s2[j]时,自然而然的c[i,j] = c[i-1][j-1] 当s1... 阅读全文
posted @ 2010-11-04 21:12 Allen Sun 阅读(590) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1012 共2k个编号,求最小m使得前k次出队的是后k个编号 方法: 1、run1012_1。坏人被kill掉的先后顺序无关紧要,知道下一个踢到的是好人还是坏人就行了。具体见注释 2、run1012_2。由于输入数的范围较小,所以可以打表实现 阅读全文
posted @ 2010-11-04 21:04 Allen Sun 阅读(523) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1001 方法: 大整数乘法 这题没什么好说的,直接用字符串模拟整个过程 阅读全文
posted @ 2010-11-04 19:57 Allen Sun 阅读(474) 评论(0) 推荐(0)