- 博客(114)
- 收藏
- 关注
原创 poj 3678
题目意思是,给出一系列的二元布尔运算,问所给变量是否存在可解的情况。这些布尔运算有与、或和异或运算。 经典的2-sat问题。由于变量之间隐含着“冲突”关系,可以通过构造2-sat模型来求解。具体的建图规则为: 若 a and b ==1 , !a->a , !b -> b a and b ==0 , a->!b , b->!a
2011-11-02 22:14:32
1145
原创 poj 1182
题目意思是,根据所给的话语,判断其真假。。。 用并查集。在加入新的元素后,及时更新父子关系。 ran[i]==0 : i和父节点同类型 ran[i]==1 : 父节点吃i ran[i]==2 : i吃父节点 以下是代码:#include#include#include#include#incl
2011-10-28 17:41:37
721
原创 poj 1659
题目意思是,给定一个度数列,判断这个度数列是否可以构成一个无向图。 根据Havel-Hakimi定理判断是否可图,再贪心构图即可。 #includeusing namespace std;const int M=20;struct node{ int
2011-09-29 17:46:50
1186
1
原创 hdu 3667
题目意思是给定一个图,求从起点送货物到终点的最小花费。 典型的最小费用流题目。不过由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式。由于是平方式,有1=1,4=1+3,9=1+3+5.。。。因此拆边的方法为做一个循环,第i次
2011-09-27 18:56:33
746
原创 poj 1422
题目意思是求最少数目的伞兵,可以走遍所有的街道。 二分图的最少边匹配,即找出最少的边可以覆盖所有的点。用匈牙利算法找出最大匹配,则最终结果为:ans = 图的顶点数 - 最大匹配。 #include#i
2011-09-24 09:26:13
848
原创 poj 3990 hdu 3694
题目意思是求四边形的费马点。 这里要严谨一点了,随便一个随机贪心算法会wa。 若四边形为凸边形,则费马点为对角线之交点。 若四边形为凹边形,则费马点为四边形中的一个顶点。
2011-09-15 12:24:23
1089
原创 hdu 2440
题目意思就是求费马点。 凸包+随机贪心法可解。先构造一个凸包,因为凸包上的点才能保证监视范围够大,最后求凸包的费马点即可。 以下是代码:#include#include#include#include
2011-09-15 12:20:02
536
原创 poj 2420
题目意思就是求一个多边形的费马点。 随机贪心算法即可。对于4条边以上的多边形没有公式求解。(三角形则比较简单)。给出这样一个贪心算法:先随机取个点(我选了凸包上的第一个点),再取一个步长(我取100),朝4个方向走,如果新位置到各点距离比原来小,就走过去;直
2011-09-15 12:16:06
900
原创 2011年8月 学习总结
八月是学校放暑假的时候,广州的天气不是一般的热啊~~~这个暑假和中大的两个博士一起高数据挖掘的算法开发,同时陪着ACM的那些教主们训练,打了一下酱油,今天是月末,就把这个月所做的东西好好总结一下吧。 首先是ACM算法竞赛方面,由于已经转型成了一个“兼职”的ACM
2011-08-31 13:38:10
760
原创 数据挖掘算法的调用
前段时间刚开始入门数据挖掘的时候,师兄需要我调用weka的经典算法,到时用于实验时做算法对比。由于当时自己Java没学多久,同时对这个开源的软件不熟悉,就上网找资料来学习调用的方法,但几乎找不到这类的资料。我这里就稍微补补“漏洞”吧(可能是我搜索技术差没找着 — — |||)。我
2011-08-31 13:37:06
3983
2
原创 poj 1515
题目意思是,给定一个无向连通图,要求去掉一些边后所得的混合图中,各个顶点仍然互相可达。 解法,求无向图的边连通分量。在同一个连通分量里,保留单向边即可,即构成一个强连通分量。而对于不同的连通分量,则期间的边必须为双向边,才能保证点与点之间互相可达。
2011-08-30 19:57:16
1285
原创 hdu 2463
题目意思是,给定一个去掉了一些边的完全图,问从顶点1可以到达多少个顶点,顶点1不算。 解题方法是hash表+bfs。hash表第i个元素记录第i个结点不能到达的点。bfs时应先排除当前结点的不能到达结点,而可到达结点直接入队即可。 算法比较暴力,
2011-08-30 17:50:25
488
原创 poj 3177 poj 3352
题目意思是,给定一个无向图连通图,问最少用多少条边可以将其变成双连通图。 用tarjan算法求双连通分量即可。tarjan算法里面只要加上一个判断从当前点出发所到邻接点不是父点即可。然后缩点,同一个双连通分量的所有点算为一个点,最终可以得到一棵树。输出这棵树的叶
2011-08-30 17:42:44
512
原创 看了3xian的退役文的一些感受。。。。
看了3xian的那篇退役文,不知说啥好。不是说他写得不好,是发觉自己做得实在太烂,很多搞ACM不应该出现的坏毛病,都集中在了我的身上。 想想自己进步慢的原因。。。。最大的一个是太毛躁吧。。。。就连这个blog里面的不少题目的解答方法神马的,都是抄了90%的。所以刷
2011-08-09 20:15:24
3026
原创 hdu 2844
题目意思是求出硬币的组合方案,使得硬币的总价值不超过价值m。 DP问题,可以转换成求多重背包的方案数目。直接套模板就可以了,思想可以看DD大牛的《背包九讲》一文。 #include#include#include#
2011-08-08 19:27:02
1726
原创 CF #80 Cthulhu
题目意思实际上是指,对给定的一个无向图,判断它是否有一个环,并且缩点后和剩下的结点可以构成一棵树。 用dfs即可解决,不必求双连通分量。dfs该图的时候记录环的个数loop,一个环的时候为loop=2,因为环的起点处会左右各dfs一次,从而多统计了一次环,具体看
2011-08-08 14:51:00
481
原创 poj 2318 poj 2398
题目意思,是给了你一个盒子,其中有板将其分成多个格子,然后有多个点,肯定是在这些格子中(在边上也算进格子)的,问各个格子拥有的点的个数。 叉积+二分搜索。由于点必定在格子中,因此,用目标点和格子边上的四个点进行叉积运算,点在格子的“左边”的右边且在格子的“右边”的
2011-08-05 15:23:40
1016
原创 hdu 2065
题目意思是,给定一个主串和多个匹配串,问每个匹配串在主串中出现的次数,不为0的输出该匹配串和它出现的次数。 用AC自动机。对每个匹配串赋予其一个标号,当在匹配中成功时,则该下标对应的一个计数数组的值加1。此题多case。。。。。。 #
2011-08-04 13:35:26
994
原创 poj 2007
题目意思,给了你一个凸包,给定起点(0,0),要你按从小到大的极角序输出其他点,极角是以原点为起点的。 凸包可解。直接把Scan算法那个排序部分拿过来就好了。 #include#include#incl
2011-08-03 20:54:21
612
原创 poj 3982
题目意思是给出三个值a1,a2,a3,求出a99,且a(n)=a(n-1)+a(n-2)+a(n-3). 这题明显可以化解出一个公式。但这里我用了java的大数运算,直接模拟了。 import java.math.BigInt
2011-08-01 14:43:31
417
原创 hdu 3006
题目意思是给定一些集合,求这些集合所能组合的集合个数。 解法是dfs+剪枝+状态压缩hash。用二进制来保存该集合的元素情况,当dfs到不存在的集合情况时才继续搜索状态。 #include#include#in
2011-08-01 01:04:48
519
原创 poj 2412
题目意思没啥好说。。。求平面上距离最远的两个点。 用凸包可解。先构造凸包,然后枚举凸包上的所有点对即可。 #include#include#include#include#include#include#
2011-07-30 23:17:23
384
原创 hdu 3833
题目意思是对给定数列找出一个数,使得其2倍为另外两个数的和且后二者的下标为该数下标的一前一后。 用hash表可解。但是的确没想出来,现在观察可以发现这道题得数列是很有规律的,是1-N的数字,因此为哈希表的存储与查找提供了便利。具体细节见代码。此题参考了牛人的解法才
2011-07-28 17:40:14
694
原创 poj 3122
题目意思是,对给定的N个PI来分给(F+1)个人,要求每个人获得的体积一样大,形状可以不同,同时不能分给同一个人的PI是来自两个不同的PI。 二分题。上界是PI的总体积和与人数的比值。下界是0。.二分时记录可以分给的总人数cnt,若cnt>f,则分得的太少,反之则太多
2011-07-28 16:11:00
515
原创 zju 1107
题目意思是给定一幅图,老鼠只能前后左右移动且最多移动k个格子(不一定在同一行或同一列,但不这样考虑也可以过。。。。),每个格子均有一定权值的食物,问从起点(0,0)开始出发的老鼠,怎么走可以获得权值最大的食物,同时要求下一个到达的格子的食物权值大于当前格子的。 和po
2011-07-27 17:09:16
609
原创 zju 3203
题目意思是求出该人的影子的最长长度,PS:影子长度包括地板上的影子长度和墙上的影子长度。 用三分极值法求解。三分法的原理建议大家看大连理工的czyuan神的blog,里面有很好地解释,这里重点解题。首先是设x为人在地上的影子长度,因此最大值为h*D/H,此时墙上无影
2011-07-25 15:19:43
581
原创 hdu 2896
题目意思很简单,给定几个模式串,看是否出现在主串中。 AC自动机可解。解法很简单,用所给的模式串构建AC自动机,然后用主串去匹配。每个模式串的末尾记录该串的标号,而中间的字符的标号为0即可,最后跑一次AC自动机就行了。 #include#include#in
2011-07-24 11:25:55
1604
原创 poj 1751
#include#include#include#include#include#include#include#include#include#includeusing namespace std;const double eps=1
2011-07-21 20:23:38
787
原创 hdu 2899
题目意思,求函数的最小值。 很少见这种要高数方法解的题目,我一直以为要有三分法,但极值毕竟不是最值,看了题解才知道解法,这里就引用牛人的解法吧:用到一次求导求单调性,二次求导判断凹凸性,然后二分查找求“极值”(个人认为是最值) 以下是代码:
2011-07-20 23:12:50
1360
原创 hdu 3599
题目意思很简单,对给定图,求其最短路径的条数,且任意两条最短路径没有相同的边。 这里的做法是:最短路+最大流。首先用dijk算法求出起点到终点的最短路径。然后构造网络流模型。对于图中的任意一条边edge[i],其两个端点a,b,若存在dis[a]+edge[i].
2011-07-19 16:49:15
721
原创 CF #77 Div 1 C ,Div 2 D
题目意思是对于一个给定的图,求从给定起点坐的士到给定终点的最小花费,并且的士的送达距离有限。 该题目可以用最短路径来做。首先对原图求各个顶点到其余所有点的最短距离,这是因为人可以在任意地方下的士并且换乘其他的士。然后保存在距离上符合要求的点,这里用一个二维数组来保存
2011-07-19 16:41:21
869
原创 poj 2192
题目意思很简单,不多讲。 这题据说数据很弱,可以用暴力解,但此处我还是用了dp来做,同样是利用了LCS的思想。dp方程dp[i][j]是指第一个字符串中的第i个字符是否与第三个字符串的第j个字符串匹配(从0开始算起)。因此有dp[0][0]=1。最后对于第i个字符,分
2011-07-11 23:31:54
805
原创 poj 1080
题意很好懂,不多说。 此题是LCS问题的扩展,众所周知LCS求的是最长长度,而这里只是用一个搭配权值代替了长度而已,因此可以借用LCS的思想来求解。c[i][j]为两个字符串在分别在长度为i和j时所得的最长长度,由于可以首字母与‘-’相搭配,因此要有一个初始化过程(可
2011-07-07 22:43:43
561
原创 poj 2250
题目实际意思,就是找两篇文章中的“最多公共单词”——其实可以把它转换成最长公共子序列问题,只是这里的序列的元素不是字母而是单词罢了。 另外,此题主要是考察LCS的形成路径,因此需要一个数组记录这个路径,这里用的是二维的字符数组dir[][],其中123分别表示斜向上,向左和向上。具体原理可以看算法导论的动态规划的最长公共子序列那一篇的内容,写得非常好。 以下
2011-06-28 14:30:00
1305
1
原创 poj 1159
题目意思是最少加多少个字母,使得原字符串变成回文串。 可以用经典的LCS思想来解决此问题,因为若一个字符串,其反串和自身的LCS就等于自身的长度,那么该串必为回文串。因此,对给定字符串求反,然后求双方的LCS,所得的长度,就是不用添加字符的最长子串。那么要添加的字符数目
2011-06-01 13:32:00
587
原创 hdu 1593
<br /> 题目意思很简单,就不多说了(全中文的)。<br /> 逃跑时如果一开始就朝enil的反方向跑是不行的。最好的策略是先找到一个湖的同心圆,并且船的角速度和enil的角速度是相等的,因为这样才能保证你可以和enil在做圆周运动时相对静止。接着要做的是
2011-05-30 21:53:00
923
原创 poj 1580
<br /> 题目意思看不懂那是不太可能的了。不过递归会tle倒有点可疑,因为discuss那里还是有人用递归过了的。<br /> 这是一道很简单的dp题,因为dp的方程已经给出并且状态转移方程也都写出了,所以根本没什么难度,就当作是认识一下dp吧,因为dp的形式有两种,一种是递推,另一种是递归,后者多用记忆化搜索来提高效率。<br /> <br /> 以下是代码:<br /> #include<cstdio><br />using namespace std;<br />const
2011-05-28 21:34:00
939
原创 poj 2182
<br /> 题目意思很忽悠人,其实和poj 2828一模一样。就是对于一个序列,其数值为前面比它小的数值个数,最后输出在此下标下每个值所对应的真是排名(很拗口,最好看看poj 2828,意思是一样的)<br /> 这道题的解法很简单。对于给定序列从前往后扫描,对于每个数值a[i],每次顺序地把a[i]+1个元素删去(用个数组vis记录情况),则其实际排名则是最后循环j所停留的位置。<br /> 可能说得很笼统,就先看一下这个O(n*n)的代码吧,看了就明白了:<br /> #inc
2011-05-25 00:34:00
1442
原创 poj 1556
题目意思是对于一个给定的房间和固定的起点和终点,其里面有好几堵墙,求起点到终点的最短路径。 黑书练习题。具体解法是把题中所给的所有点看成是图中的一一对应的点,点与点之间可以连线当且仅当该线段与墙不相交。最后用dijk求起点到终点的最短路即可。 代码很长,一般的计算几何题都是如此,细心是关键: #include#include#include#includeusing namespace std;const int M=200;const int N=10000;co
2011-05-24 23:51:00
818
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人