随笔分类 -  算法集

1 2 下一页
HDU 4068【全排列枚举简单题】
摘要:题目:SanguoSHA题意:三国杀1vs1,给出英雄之前的约束关系,无论对手如何安排英雄pk顺序,是否都有机会赢。解题思路:比赛时第二道看的题目,看到N小于等于6时就果断敲了。对自己英雄从字典序最小生成全排列,对应一个全排列对对手生成全排列,如果自己的英雄当前的排列能战胜对手的全排列,则当前英雄序列为解。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <algorithm> 阅读全文
posted @ 2011-10-09 18:07 Kenfly 阅读(676) 评论(0) 推荐(0)
HDU 3640【非常复杂模拟题+二分】
摘要:题目:I, zombie题意:植物大战僵尸的模拟题,地图只有一行,两种植物,一种会射弹,一种是炸弹,求僵尸胜利的最小个数。解题思路:第一感觉是没感觉,然后觉得好繁杂,各种情况。经过长久琢磨后,思路慢慢清晰,然后AC。觉得还是挺好的一道模拟题。模拟时主要有三个问题要维护,一是植物的长度,二是最右边的植物种类,三是僵尸最左的位置。如果僵尸碰到的是炸弹,那么下一回合可以认为僵尸的最左位置为炸弹的左边。如果碰到的不是炸弹,则不停向左统计植物个数,直到遇到第一个炸弹,然后二分可以吃掉这些植物的最少僵尸个数,二分时要根具条件进行模拟。View Code 1 #include <iostream> 阅读全文
posted @ 2011-10-05 22:35 Kenfly 阅读(833) 评论(0) 推荐(0)
HDU 3920【状态压缩DP +优化】
摘要:题目:Clear All of Them I题意:有2n个敌人,给出你的坐标和敌人的坐标,让你射n次枪将所有敌人杀死,每一次可以且仅可以射死两个敌人。解题思路:刚开始无任何证明地用了最小生成树提交,wa,然后状态压缩DP,TLE,看了解题报告才知道自己的状态压缩DP写得有点萎,原来可以从O(2^n*(n*n))优化O(n2^n),以前从未想过。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include 阅读全文
posted @ 2011-10-04 20:48 Kenfly 阅读(445) 评论(0) 推荐(0)
HDU 4046【树状数组】
摘要:题目:Panda题意:长长一篇情书纯是忽悠选手们的。给一连串由wb组成的字符中,从中找出"wbw"子串个数,有两种操作,操作0,L,R,询问L~R子串内包含"wbw"的个数。操作1,k,ch,将第k个字符更换为ch。解题思路:带着绵绵情意看完了整个题目后就崩出树状数组了,很明显啊,动态更改值,动态个数。sum(i)表示1-i字符串内包含"wbw"子串个数,则对第一个询问操作,直接可输出sum(R)-sum(L+1)即可,想想为什么要L+1呢? 对第二个操作,判断下更改前和更改后的情况,适当更新树状数组即可。详情代码。View Code 阅读全文
posted @ 2011-09-27 02:22 Kenfly 阅读(365) 评论(0) 推荐(0)
HDU 4026【状态压缩DP+判断路径可达】
摘要:题目:Unlock the Cell Phone题意:玩过Android吧,有个叫图案屏锁的。这题求连接所有的点能产生的图案锁的个数。输入n,m表示图案为n*m的规模(n,m<=5),然后输入一个n*m的矩阵g,g[i][j]表示该点的类型,为0时表示普通的点能触点能滑动,但不能跨,为1时这个点不能被点击和滑过,为2时表示这点能跨过但不能触点。求连接所有的普通点能构成多少个图。 p=""> 解题思路:网络赛时没看过这题,如果看了相信会花一个下午的时间钻在这题上,状态压缩DP是我最想征服的类型。这跟哈密顿图的解法差不多,其实就是求哈密顿通路个数吧。DP[i][s] 阅读全文
posted @ 2011-09-27 01:08 Kenfly 阅读(697) 评论(0) 推荐(0)
HDU 4023【博弈+贪心策略】
摘要:题目:Game题意:有如下图15种棋盘,给出每种棋盘的个数。Alice有无限个1*2形状的棋子,Bob有无限个2*1的棋子,棋子可以嵌进棋盘里,但棋子不能旋转和跨棋盘(T_T泪目啊,比赛时一队员跟我说可以跨棋盘,搞得把这题看成神题,最终仅仅浪费了时间在这题上),Alice和Bob轮流着放,Alice先放,谁最先不能嵌入棋子就输。解题思路:有15种,或许看起来很是繁杂。其实细心研究一下,应该能找出一些解题的策略。只有决定好选择棋盘的顺序,这题就迎刃而解了。下图是鄙人找到的顺序,首先数组的第一个元素是拿来给忽略的。A数组保存了Alice的选择顺序,B数组保存了Bob的选择顺序。按什么排序的呢?明显 阅读全文
posted @ 2011-09-26 16:41 Kenfly 阅读(534) 评论(1) 推荐(0)
HDU 4028【map离散化DP】
摘要:题目:The time of a day题意:给出一个数N,表示有N条指针,编号1~N,第i条指针旋转一圈所要用的时间是i,从中挑选一些指针,决定一天的长度,这个长度定义为这些指针两次重合的时间间隔。然后给出一个m,求出长度大于等于m的组合数,也就是选择指针的方法数。解题思路:很明显这个长度为挑出指针的最小公倍数。朴素的想法是用递推造出所有的最小公倍数,然后找出大于等于m的。但N最大为40,给合数也有2^N-1个,数组开不下。所幸这些最小公倍数有很多是重复的,经打表什么的发现好像只有10万个不同的最小公倍数。要造出1-i这些数组成的最小公倍数很简单,用个O(N*N)的递推算法。假设前面已造好了 阅读全文
posted @ 2011-09-26 11:33 Kenfly 阅读(666) 评论(0) 推荐(0)
POJ 3356【简单DP】
摘要:题目:AGTC题意:如题解题思路:看代码View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <map> 8 9 using namespace std;10 11 const int MAX = 1000 + 10;12 char X[MAX], Y[MAX];13 int 阅读全文
posted @ 2011-09-25 19:19 Kenfly 阅读(354) 评论(0) 推荐(0)
POJ 3616【数状数组求区间最大值 + 简单DP】
摘要:题目:Milking Time题意:给出一个数N,表示Bessie在0~N时间段进行挤牛奶工作。然后给出M行数值,每一行为f,t,v,分别表示在时间断f,t内Bessie能挤到的牛奶量。然后给出一个R,表示每次Bessie挤完牛奶都要休息R小时才能继续下一个工作,求Bessie最大的挤奶量。解题思路:很简单的DP,刚开始WA了两次,因为时间两边的界限没处理好。转移式:DP[i] = max{DP[D[j].to], DP[D[j].from - R] + D[j].val},要求某一区间的最大值,可以用数状数组实现。View Code 1 #include <iostream> 2 阅读全文
posted @ 2011-09-25 17:39 Kenfly 阅读(852) 评论(0) 推荐(0)
POJ 1988【并查集+记录个数】
摘要:题目:Cube Stacking题意:有N个cube,编号1-N,有两种操作:操作1: M x y 把含有cube的堆堆放在含有y的堆的上面。操作2: C x 询问cube编号为x的下面有多少个cube。解题思路:黑书上有类似题目,属于带有查询操作的并查集。设置两个变量D, C,D[i]表示i下面有几个cube, C[i],表示以i根时儿子个数,也就是堆在它上面的cube总个数。在每个M,C操作都要对x,y结点进行更新,有两种更新,一个是更新D[i],不停向根累加,一个是路径压缩。具体参考代码。View Code 1 #include <iostream> 2 #include & 阅读全文
posted @ 2011-09-24 20:36 Kenfly 阅读(281) 评论(0) 推荐(0)
HDU 3586【树形DP+二分】
摘要:题目:Information Disturbing题意:给出一棵树,和每条边的cost值,设置一个界限,要求切断所有叶子结点,切断的边的cost不能超过界限值,并且切断的边的总和不能超过m,求出这个最小界限值。解题思路:很明显的一道树型DP,DP[v],表示切断根结点的v的子树的最小花费,那么这个界限怎么处理呢,由于界限值范围要比总和m小得多,才1-1000,可以用二分枚举,这样在选择切边时可以根据这个枚举值进行判断处理。每个结点v,设其儿子结点为x1,x2,x3...则DP[v] = Min{DP[x1],Node[x1].cost} + Min{DP[x2], Node[x2].cost} 阅读全文
posted @ 2011-09-22 18:59 Kenfly 阅读(300) 评论(0) 推荐(0)
HDU 4008【树型DP+树儿子兄弟判断】
摘要:题目:Parent and son题意:输入N,Q,接着输入N-1条边,组成树,结点以1-N命名。然后输入Q个提问,每个提问输入X,Y(X!=Y),表示当以X为树的根结点时,求Y的最小儿子和最小子孙。解题思路:以1为根,进行DFS遍历,DP每个结点的最小儿子和最小子孙,注意最小儿子要包括其father,方便后面处理。有了这些信息后,对每个提问X,Y。分三种情况:s第一种情况:当Y==1时,X肯定是Y的儿子。这个要特殊处理,因为上面获得信息不能取得其最优解。因为DFS结果的最小子孙sx有可能跟x在同一棵子树上,那么当以X为树根时,Y的最小子孙肯定不是sx。所以结点1要预先处理。找出其最小的子孙s 阅读全文
posted @ 2011-09-15 16:53 Kenfly 阅读(772) 评论(4) 推荐(1)
HDU 4033【数学几何余弦定理+二分求解方程】
摘要:题目:Regular Polygon题意:给一个正N边形内一点到各顶点的距离,求正N边形的边长。解题思路:听了题意后,马上想到的是二分答案,然后想到是根据面积相等构造等式,于是杯具了,直接导成都无望入线T_T,原因是根据面积相等构造的函数单调性难以判断,很麻烦。赛后一天cxyue跟我说根据内角度之和为360度就很容易二分了,原因是当边长与内角大小成正比,无疑是单调关系。但是提交总是WA,错误出在精度上,XX**,处理这些精度问题最讨厌了。精度调到1e-9TLE,调到1e-7WA,只有1e-8AC,妹!View Code 1 #include <iostream> 2 #includ 阅读全文
posted @ 2011-09-14 15:38 Kenfly 阅读(334) 评论(0) 推荐(0)
HDU 4027【线段树+求和+动态改变区间各数的值】
摘要:题目:Can you answer these queries?题意:首先给出1-N个数,然后有两种操作。第一种操作: 0 x y, 表示将x,y之间的数全部开根号。第二种操作: 1 x y, 表示求x,y之间的全部数之和。解题思路:看到题目,应很自然想到了线段树和数状数组,两种结构都能快速求出区间之和。但两者的优点不尽相同,前者在维护方面更自由一点,后者能更快速维护和求和。这题的解题突破点是:当一个数开根后得到1或0时,此后此值不会再改变。利用这个特点,设置一个变量表示x,y区间是否全部为1或0,如果为真,则在这个区间上的第一种操作直接忽略。View Code 1 #include < 阅读全文
posted @ 2011-09-14 01:36 Kenfly 阅读(417) 评论(0) 推荐(0)
HDU 3627【线段树变形+离散化】
摘要:题目:Giant For题意:一个容器有三种操作:add x y: 增加一坐标。remove x y: 去除一坐标。find x y: 查找容器里的一坐标使得其座标值大于x y,如果有多组值,按主以x次以y排序,输出最小x, y(0 <= x, y<= 1000000000)解题思路:用线段树维护坐标点,以x值作为叶结点,然后第个结点保存其子树的最大y值,如果find x, y,从根结点开始,往符合条件的子树深入,即往子树有大于x的叶结点和大于y值的结点的子树前进这里x,y值很大,数组开不下去,但操作数最多才200000,也就是最多才有200000对不同的数,首选输入所有的操作,按 阅读全文
posted @ 2011-09-09 14:11 Kenfly 阅读(278) 评论(0) 推荐(0)
HDU 4002【高精度+欧拉函数+java】
摘要:题目:Find the maximum题意:如题。解题思路:打表后不难找出一条规律:要找的那个数总是2*3*5*7*...这样的值,用递推方法求出所有范围内的这些素数积,从中用二分找出符合的数就行了。比赛的时候,小杰用其独藏的C++高精度模版写了个,TLE,然后cxyue用java过掉了。当时我说用二分查找优化下啊,cxyue说才100个数,二分没多大用,后来那天晚上,小杰跟我说他100多ms过掉了,用了二分。不懂java,下面是鄙人对着类库敲出来的AC代码。顺便一说,为什么类成员变量要定义为static呢,因为只有static数据成员才能被static成员函数调用,main函数是static 阅读全文
posted @ 2011-09-09 13:15 Kenfly 阅读(504) 评论(0) 推荐(0)
HDU 4001【DAG图的最长路径】
摘要:题目:To Miss Our Children Time题意:给出n个长方体,其长宽高分别为ai,bi,ci,di, di为长方体的类型。di为0的长方体,当其长宽分别大于或等于某个长方体时,可以摆放在某个长方体上面。di为1的长方体,当其长宽分别大于或等于且其底面积大于某个长方体时,可以摆放在某个长方体上面。di为2的长方体,当其长宽分别大于某个长方体时,可以摆放在某个长方体上面。求通过这些长方体可以摆出的最高塔的高度。解题思路:这题是经典的求DAG图上的最长路径题目。用边表示一个长方体可摆放在另一个长方体这种关系,给所有可能组合的两个长方体造边,则会得到DAG图,这题有个特别小心的地方是当 阅读全文
posted @ 2011-09-09 12:42 Kenfly 阅读(1349) 评论(0) 推荐(0)
HDU 4003【树型DP+背包】
摘要:题目:Find Metal Mineral题意:给出一棵树,选择一个s点为根,最多给出k个机器人,从根结点开始,求遍历所有的结点的最小花费。解题思路:树存在递归结构,对每个结点,他和他的后代组成一棵树,且他所有的儿子都是一棵树,则该结点的状态一般由其子树递推而来,每棵子树达到最优时,才能推出根结点的最优解,可采用递归DFS很方便处理。本题可以设DP[n][i]表示结点为n的子树放进i个机器人时的最小花费,其中DP[n][0]特殊,表示放进一个机器人又返回了该结点,结点n的所有儿子结点为DP[si][i],难点是如何从DP[si][0...k]组合成i从而使DP[n][i]最小,即从每个结点中选 阅读全文
posted @ 2011-09-08 23:41 Kenfly 阅读(369) 评论(0) 推荐(0)
Shift-And 与 Shift-Or算法
摘要:当模式字符串长度数比机器字短和总字符集个数比较少时,Shift-And与Shift-Or算法平均效率是KMP的两倍,下面是Shift-And算法,Shift-Or是同样我思想,只不过用位0表示真状态 1 #include <cstdio> 2 #include <cstring> 3 4 void shiftAnd(char *t, char *p) 5 { 6 int lenP = strlen(p); 7 int b[26] = {0}; 8 for(int i = 0; p[i]; ++i) 9 {10 b[p[i] - 'a'] |= ... 阅读全文
posted @ 2011-07-22 16:48 Kenfly 阅读(1432) 评论(0) 推荐(0)
中大省赛试机题【环形最大连续和】
摘要:题目:http://soj.me/index.php题意:给一连串的数字, 组成一个环,找出其最大的连续和.解题思路: 如果不是环,直接用O(n)的贪心算法求出最大连续和. 所以这题可以分两种情况,先设第一个数是起点,可以当作环的断点,如果最大连续程没有跨越这个断点, 那么就是上面所说的情况,直接可求得. 如果跨越这个断点,那么,这个最大连续和里必定包含A[1] 和 A[N],也就是始末点.这样,可以简单地算出包括这两点的最大连续和了. 用一个DP1[i] 来记录1...i点的最大连续和, DP2[i]表示i...N的最大连续和, 当然这两个连续必需分别与1和N点连接的. 枚举每个i... 阅读全文
posted @ 2011-05-07 20:50 Kenfly 阅读(374) 评论(0) 推荐(0)

1 2 下一页