- 博客(27)
- 资源 (4)
- 收藏
- 关注
原创 HDU 3374 KMP +字符串最小表示
求字符串最小表示的方法 (1) 利用两个指针p1, p2。初始化时p1指向s[0], p2指向s[1]。 (2) k = 0开始,检验s[p1+k] 与 s[p2+k] 对应的字符是否相等,如果相等则k++,一直下去,直到找到第一个不同,(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。则该过程中,s[p1+k] 与 s[p2+k]的大
2011-08-27 21:30:48 962
原创 POJ 2481 cows
还是太弱,很明显的一道树状数组竟然很久想不出来。这道题如果想到如何排序了,就好做了。 按题目题意,我们要找强壮的,那么就先把最强壮的找出来,存起来,然后找第二强壮的,此时已经知道比他强壮的牛有多少头了,依次类推,最后所有牛的结果都能求出来,如果从最弱的开始找,显然是无法找出来的。 然后注意一下区间重合时一定要特判。每头牛都要插入树状数组中。 /* ID: sdj22251 PRO
2011-08-26 11:10:28 592
原创 POJ 3322 Bloxorz I BFS
一道有趣的搜索题,用广搜比较好。注意记录状态即可, 然后更新好标记数组。每次是根据方块左上角的坐标来进行操作的。 判断能不能走的时候一定要注意占两个格的情况,到达终点时一定是竖起来才行,薄弱地带一定不能竖起来。 队列可以用STL 也可以用数组,不过用数组的话,交到G++上,可以优化到700ms或者更少 /* ID: sdj22251 PROG: subset LANG: C++ */ #
2011-08-25 10:44:42 2183
原创 HDU 3969 Crazy Basketball Fan 模拟
再没有比这道题更纯的模拟了,只不过超长的描述和超多的细节,使得一般没人会在比赛中做这种题。太浪费时间了。 我是因为只会做这种题才去做这道题的,谁知道就这样调了一下午,在比赛结束前半分钟才A掉。从来没写过这么长的模拟。 这道题主要是就是细节的考虑,而且所有要注意的题目
2011-08-24 20:29:13 1300 1
原创 POJ 3544 Journey with Pigs 贪心
首先根据村庄离A的距离和单位路程的花费,以及当地猪肉的价格,我们可以把到达每一个村庄卖猪单位重量赚的钱算出来。然后,按收益降序排列,再把猪的重量降序排序,这时,根据排序不等式,就可以达到最大盈利了。 所谓排序不等式: 排序不等式(sequence inequality,又
2011-08-22 21:54:34 1065
原创 POJ 2367 Genealogical tree 拓扑排序
本题属于最基础的拓扑排序。大意就是,给出一个数n, 然后底下n行,编号1到n, 每行输入几个数,保证结果中该行的编号要在这几个数前面。 /* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include #include #include #include #include #incl
2011-08-20 21:32:39 2218 1
原创 POJ 3687 Labeling Balls 拓扑排序
这道题是拓扑排序的一个变种, 题目的要求是编号最小的点尽量在前面,而且在满足编号1尽量靠前的条件下,编号2要尽量靠前,在满足前两个条件下,编号3尽量靠前,依次类推。 首先,传统的拓扑排序就无法解决这个问题了,我们只能做到每次尽可能把编号小的点放到前面,但不能保证就是编号1尽量靠前,然后编号2.3等等均尽量靠前。这时就要转变一个方法了。那就是逆序求拓扑序列。每次找到最大的拿出来放到序列的尾部,然后
2011-08-20 20:59:11 1470
原创 POJ 1094 Sorting It All Out 拓扑排序
第一次做拓扑排序的题。 题目大意是给定一组字母的大小关系判断它们是否能组成唯一的拓扑序列。 代码写的有点乱,因为思路上比较混乱点。 一般来说,在一个有向无环图中,用 BFS 进行拓扑排序是比较常见的做法 1.把所有入度为 0 的节点放进队列 Q 2 WHILE: Q 不是空队列 3.从 Q 中取出队列首元素 a,把 a 添加到答案的尾部。 4.FOR:所有从 a 出发的边 a →
2011-08-20 19:39:03 1027 1
原创 POJ 3668 Game of Lines
如果用set来做的话,这个题就变的非常非常水了, 完全不用考虑精度问题。 用一个结构体存储直线,然后插到集合里,最后输出集合的大小即可。 然后求公约数的时候有个负数问题,后来发现我多虑了。 负数取模 用%运算的时候,首先是两边都
2011-08-20 14:39:10 1179
原创 POJ 3604 Professor Ben
这题的大意就是 给出一个数n, 找到它所有的因子, 然后把这些(因子的因子数)的立方和求出来。 题目的时限虽然很宽,但是数据很BT。首先,公式必须找出来。 证明如下: 先将n质因数分解成形如n = a ^m * b ^ p * c ^q *........; 那么要求的结果为函数g(x)的值; 我们以n有2个质因数为例子; g(n) = g(a ^m * b ^p ) ; 设求因
2011-08-20 14:21:51 1564 1
原创 USACO Section 2.1 The Castle (POJ 1164) floodfill
又是一道简单而又经典的搜索题,用floodfill一个房间一个房间的填充,每次都用标号标记一下,中间的围墙用二进制存储,这样搜索的时候就方便许多了。 最后再扫描一遍就能得出答案,注意扫描要从左下角开始,先往上扫描,再往右扫描。 /* ID: sdj22251 PROG: castle LANG: C++ */ #include #include #include #include
2011-08-20 10:51:27 1473
原创 USACO Section 1.4 Packing Rectangles (POJ 1169)搜索
这是一个很蛋疼的搜索题,虽然题中只给了5种矩形组合方式,但是搜索时的长和宽并不是唯一的,所以就产生了很多种组合方式.需要注意的是第4种和第3种图形实际上能规划成一种。 而产生这些组合最好用的应该就是DFS了,而我当时不想动脑子,使用的就是纯枚举,巨大的代码量,最终好歹也能过了。 /* ID: sdj22251 PROG: packrec LANG: C++ */ #include #inc
2011-08-20 10:37:41 1255
原创 USACO Section 1.4 Mother's Milk 搜索
这道题是一个让人做完觉得很爽的搜索题,可以用深搜也可以用宽搜。 相对来说,深搜的代码量稍微小一点。 搜索策略就是模拟倒来倒去的过程,并且出现重复的没有意义。 BFS版本: 我是人工写了个队列,这样比STL中的快一点 /* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include #inclu
2011-08-20 10:26:53 978
原创 POJ 2352 Stars 树状数组
这道题是标准的树状数组,而且输入数据已经有序。所以边输边查询就行。后输进来的不影响之前的结果/* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include #include #include #include #include #include #include #include
2011-08-19 21:07:29 491
原创 POJ 3702 Chessman 状态压缩 + 深搜
这道题是一道很好的搜索题,由于走四步会循环,所以可以压缩为0,1,2,3四种状态,判断第一个是否能转为第二个,就看两个串中这四个状态分别是否相等,如果相等,就能转化了。再者,走四步会循环,所以普通这么走肯定不行,要根据底下的走3步和走2步的特殊走法来搜索才行。这道题既可以用BFS也可以用DFS来做,相对来说,DFS更加简洁一些, /* ID: sdj22251 PROG: calfflac LA
2011-08-19 13:00:14 954
原创 POJ 3724 Find the parameter 二分
这道题可以说卡精度卡到了极致,比较时eps竟然开到10才AC的,让我试了十几次,实际上做商跟1比较是最好的方法。/* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include
2011-08-19 11:35:56 606
原创 POJ 3714 Raid 最近点对
求最近点对,只不过这两个点需要属于不同的集合,那么就给两个集合的点分别标记一个id号,在计算时,两个集合合并起来,并排序,递归求解,只不过,求两点距离时,如果id号是同一集合的,直接返回一个很大的数就行了,这样就跟求一个集合的最近点对没什么区别了。 /* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include
2011-08-18 21:00:09 939
原创 POJ 3740 Easy Finding 位运算压缩+DFS or Dancing Links
Easy Finding 这道题运用二进制DFS是比较好的方法,当然还可以用dancing links,这个比较高级,先把我看别人的二进制思路然后写的代码贴上来。 当然本题是体现不出DLX的高级之处的。用位运算和DLX的速度应该是相当 /* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #in
2011-08-18 15:34:52 886
原创 POJ 3895 Cycles of Lanes
题意是求最大环的边数。做这题发现用vector特别好用。DFS即可。/* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include #include #include #include #include #include #include #include #include #i
2011-08-18 10:11:18 1018
原创 POJ 3993 Not So Flat After All
原来就是对两个数分别因数分解,然后分别放到两个集合里,求合并后的集合的大小。再求每个数与另一个集合中该数的幂级数之差,如果另一个集合中没有这个数,就相当于这个集合中这个数的幂级数是0,最后把这些差的绝对值相加就是结果。 /* ID: sdj22251 PROG: calff
2011-08-17 16:22:09 881
原创 POJ 3909 Lucky numbers 深搜预存+二分
先用深搜将所有的lucky numbers 搜出来,然后再根据这些再深搜出所有的very lucky numbers,总共约35W个;最后输出数据时用二分查找进行计算 看别人的解题报告后,我也用了unique这个函数,这个函数具有去重功能,但实际上并不是删除重复的,而是将重复的
2011-08-17 14:32:24 1322 2
原创 POJ 3925 Minimal Ratio Tree 最小生成树
思路是枚举+最小生成树,用DFS枚举或者二进制枚举。 /* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include #include #include #include #include #include #include #include #include #includ
2011-08-16 16:50:33 1489
原创 POJ 3908 Quick answer 并查集
本题是并查集的运用,在删除操作时,除了该删除的点外其他连接关系不变,那么具体操作就将这个点变成新的点即可,用一个id数组更新id即可。/* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include
2011-08-16 14:39:49 854
原创 POJ 3928 Ping pong 树状数组
树状数组的运用 具体就是枚举每个裁判,左边比裁判小的个数乘以右边比裁判大的个数,以及左边比裁判大的个数乘以右边小的个数,总和即为结果 /* ID: sdj22251 PROG: calfflac LANG: C++ */ #include #include #include #include #include #include #include #include #incl
2011-08-16 13:31:59 1115
原创 POJ 3974 Palindrome 回文串
求最长回文串 由于数据大 需要O(n)的算法 Manacher算法 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的
2011-08-15 22:53:35 3476
原创 HDU 2962 Trucking 最短路
最一般的方法就是二分高度,每次求一次最短路,看能不能求出来。 我的做法是先求一次最大生成树的最小边,就能得到高度,然后再求一次最短路。这样在高度比较大和数据比较大的时候,效率比二分那个方法要快很多。 poj 1797和这题比较类似, 只不过那题简单一些,只要求高度即可,不用求最短路。 我是用的是dijkstra求最短路和prim 求最大生成树。代码有点乱。 求最大生成树的关键点是只要连接到终点
2011-08-15 22:32:42 817
原创 POJ 3903 Stock Exchange 最长上升子序列
利用了二分的思想来找已经放进去的第一个比读入元素大的位置,然后替换一下就行,如果读入的数比头上的数目还大,那么更新头部,加入一个新的数,最后这个数组的大小就是最长的上升子序列了,复杂度大约nlogn,比传统的n2快了不少; /* ID: sdj22251 PROG: cal
2011-08-15 22:11:50 980
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人