
ACM
文章平均质量分 71
super_chris
这个作者很懒,什么都没留下…
展开
-
编程之美 寻找发帖水王 扩展问题
编程之美中的“寻找发帖水王”描述的是这么一个问题,有一个ID列表,其中有一个ID(水王的ID)出现的次数超过了一半,请找出这个ID。书中的思路是每次从列表中删除两个不同的ID,不影响“水王的ID在剩余ID中仍然超过一半”这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。具体编程的时候,使用一个candidate记录当前猜测的水王ID,一个count记原创 2012-01-09 15:03:56 · 10840 阅读 · 4 评论 -
单调队列 POJ2823
看这个问题:An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the v原创 2011-07-08 15:10:54 · 1422 阅读 · 0 评论 -
catalan数
<br />算法课最后一节讲到了卡特兰数,总结和学到了很多以前不知道的东西。<br />卡特兰数的递推公式是F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}<br />一般性公式为F(n)=C(2n,n)/(n+1)<br />可以描述的问题有<br />1、n个元素的二叉查找树有多少种。<br />2、n*n棋盘从左下角走到右上角而不穿过主对角线的走法。<br />3、2n个人排队买票问题,票价50,n个人拿50元,n个人拿100原创 2011-01-03 15:33:00 · 9969 阅读 · 5 评论 -
理解动态规划
看了算法导论上对动态规划的讲解,觉得自己对动态规划的理解又进了一步,之前在读到《算法之道》相关章节时就有这感觉,但是仍然不敢说自己已经完全掌握了动态规划,只是比以前又透彻了一些,说说自己新的理解,其实就是复述一下算法导论上的内容而已。0.两个例子:装配线调度问题一个产品要经过N道工序,有两条装配链提供着N道工序,在任何一道工序i时产品都可以选择在两条线上的一条进行加工,在装配线1上加工工序i的时间为a[i][1],装配线2上类似。在同一条装配线上前进不花时间,跳转到另一条装配线上需要一定的时间t[1][i]原创 2010-12-25 15:41:00 · 2423 阅读 · 1 评论 -
网络最大流、二分图最大匹配、POJ2536
<br /> <br />通常我们把一个有向无环图边上的权值看做两个节点之间的距离,在这个模型下的问题有各种最短路问题。如果将边上的权值不看做距离而看做两点间的容量(比如两个城市之间一天的运输能力),这样的有向无环图就叫做流网络,对应的问题就是求最大流——单位时间内通过网络的最大容量(比如工厂所在城市一天最多可以生产多少才能全部经过一个流网络运到仓库所在城市而不造成中途的淤积)。<br />流网络只有一个源点和一个汇点。关于定义就不说了,算法导论上很清楚。有一点要说的是,如果一个流网络有多个源点和多个汇点,原创 2010-12-14 14:08:00 · 2659 阅读 · 0 评论 -
二叉树先序、中序、后序遍历的非递归实现
<br /> <br />在网上看了一些用非递归实现先序中序后序遍历二叉树的代码,都很混乱,while、if各种组合嵌套使用,逻辑十分不清晰,把我也搞懵了。想了大半天,写了大半天,突然开了窍,实际上二叉树的这三种遍历在逻辑上是十分清晰的,所以才可以用递归实现的那么简洁。既然逻辑如此清晰,那么用非递归实现也应该是清晰的。<br />自认为自己的代码比网上搜到的那些都清晰得多,好理解得多。<br />稍微解释一下:<br />先序遍历。将根节点入栈,考察当前节点(即栈顶节点),先访问当前节点,然后将其出栈(已经原创 2010-11-23 14:34:00 · 1749 阅读 · 3 评论 -
切意大利馅饼
一块意大利馅饼,切N刀,最多可以切成多少份?N条直线可以将一个平面分成多少个区域?1条直线 22条直线 43条直线 7这样想,第N条直线即使不与之前N-1条直线中的任何一条相交(实际上这种情况是很特殊的,要求所有N条直线都平行,这是违反切割策略的),它也切割了一个区域,而在此之外再每与一条直线相交,就多经过一个新的区域——因为所有区域都是凸的,所以一条直线只能经过一个区域至多一原创 2010-03-11 14:22:00 · 1050 阅读 · 0 评论 -
归并排序理解
归并排序是利用分而治之思想进行排序。具体说来是递归的思想。不断地将问题分解为较多较小的子问题,直到子问题的规模小到不需要再分解也不需要求解而是自然有解(只有一个元素,自然有序),再从底往上进行归并。归并的操作是将两路各自有序的序列合成一路有序数列,具体做法是利用游标、比较实现。void MergeSort(int a[],int n){ int *b = new in原创 2010-02-09 14:58:00 · 999 阅读 · 0 评论 -
Dijkstra算法详述
Dijkstra算法解决的是有向加权连通图中,单源节点到所有节点的最短路径问题。即已知一个有向加权连通图G,和该图中的源节点s,求s到其他所有节点的最短路径。由于是有向加权图,所以用邻接矩阵描述比较合适,a[n+1][n+1]用来描述该图,其中a[i][j]为i到j的目前所知的最短距离,如果没有直接路径,暂时设为NoEdge(一个很大的数)。用一个链表L(也可以是优先队列,因为每次都要原创 2010-02-08 20:57:00 · 935 阅读 · 0 评论 -
POJ 3087 shuffle'em up map判重
这道题说的是洗牌,已知一沓牌的初始状态,问经过多少次洗牌能达到给定状态,或者永远不能。想起前阵子看的《欺诈游戏》里面的一场扑克赛,秋山逼迫洗牌手用perfect_shuffle,其实就是这道题里的这种洗牌方式,结果成功算出了所有牌的位置。这也说明这种洗牌方式对牌的排列是有铁打的规律的,确实如此,简单思考便可以得出这个规律,于是问题便得以简化,不断地按照洗牌规律变换牌的排列顺序,每次洗完牌对比目标状原创 2009-12-26 20:21:00 · 1894 阅读 · 0 评论 -
POJ 3349 所谓哈希
数据结构者,“数据间关系+数据存储方式”也。选择何种数据结构,取决于需要解决什么样的问题。任何一个数据结构都有它的优势,这个优势说白了就是“本数据结构在进行XX操作时快”,而选择何种数据结构就看要解决的问题需要在数据结构上进行何种操作来决定。哈希表就是体现这个道理的一个很好的例子。哈希表提供这么一种其它数据结构并不擅长的操作:“在理想情况下,能用常量时间查找到指定值的数据”。原创 2009-12-15 23:17:00 · 1518 阅读 · 0 评论 -
POJ 2251 折腾我5个小时的BFS
唉,还是一个逻辑上的错误,根本就测试不出来,测试过程中还发现了网上一套AC代码的错误,囧。逻辑上的错误,不严密,后来对照另一套AC代码发现了,总结一下:这道题里,我是打算把所有处理过的结点标记,然后把他相关的下层节点(如果没有被标记就表示没有被处理过)入队,这样搞。可是,有可能有这种情况,打算入队的结点,虽然没有被处理过,但是已经在队列中等待处理了,这样就不应该再让它入队了,所以,解决原创 2009-10-04 01:54:00 · 621 阅读 · 1 评论 -
poj 1129 DFS 无剪枝就可AC
这道题似乎也没什么剪枝可写,没有细想。就是DFS。还是,写代码的过程中牢牢记住DFS的思想即可。代码如下:#include #include using namespace std;int rep[26][27],channelChosen[26];bool check(int curRep,int curCha,int amount){ fo原创 2009-09-29 12:03:00 · 999 阅读 · 0 评论 -
POJ 1683 所谓DFS(深度优先遍历)
所谓深度优先遍历,把问题想象成层次问题,每一层都有几个选项可供选择。我们按深度优先遍历,就是只要当前选项还有可能对,就相信它是对的,往下一层次进发,如果到了某一层证明当前选择不可行,则选择该层其它选项,如果该层无其它选项可选,即该层所有选项都不可选,则说明问题出在上一层,则回溯到上一层重复“选择其它选项,若无其它选项继续回溯”的操作。深度优先遍历的控制方法就像上面提到的那样:在某一层,原创 2009-09-27 21:23:00 · 1577 阅读 · 1 评论 -
快速排序模板
写了个快排的模板,写了个int版的。下了个GCC,在命令行下写C++的感觉还不错。代码如下:#include using namespace std;template void quick_sort(T* array,int low,int high){ if(low<high) //如果low==high,说明只有一个元素,不需要排序,即到了quick_s原创 2009-09-23 15:31:00 · 1272 阅读 · 0 评论 -
所谓堆和堆排序
堆,是一棵完全二叉树,根的值大于左右子树中所有结点的值,左右子树也是堆,除此之外,对其它元素之间的大小关系(如左右子树之间元素大小关系)没有要求。 这是大根堆,如果把“大于”换成“小于”,就是小根堆,这里都以大根堆为例。 由于堆是完全二叉树,所以可以用数组来模拟,在数据结构上算是比较简单(所以才敢学啊,以前未考虑到它是完全二叉树,以为要用到二叉链表,迟迟没敢看。。)。原创 2009-09-22 22:44:00 · 7754 阅读 · 2 评论 -
POJ 1131 My first java AC~高精度 体验JAVA
import java.io.*;import java.util.*;class Main{ public static void main(String[] args) { System.out.println("hello,java!"); }} 三天时间算是对JAVA有了个大概的认识JDK JRE 设置环境变量装ECLIPSE 后原创 2009-09-21 23:24:00 · 2130 阅读 · 0 评论 -
POJ 8道简单的并查集 秒光了所有已知的简单并查集,总结一下,共8道。
并查集算是自己掌握的第一个进阶数据结构或算法。 很简单的结构,解决问题的针对性也很强。 是并查集的问题也许一眼就能看出来。 一口气A了8道。 今天先把代码贴上来吧。 有时间写个总结。 坐了一会了,有点累。。 第一道1182,经典的食物链,是并查集的一个典型模型,但是并不是最简模型。 代码:#include using na原创 2009-09-18 22:21:00 · 4052 阅读 · 2 评论 -
poj 2524 这是并查集的最简模型了吧
没啥说的,最简单的并查集模型了,什么多余的工作都不用做,没有节点信息需要你更新。代码如下:另外,还是因为一个巨白痴的错误WA了很多次,哭啊。。。#include using namespace std;struct { int parent;}student[50005];void MakeSet(int SizeOfInt){ for (in原创 2009-09-17 11:22:00 · 838 阅读 · 0 评论 -
POJ 1308 这还算并查集吗?
这还算并查集吗? 形似。 其实就是用了父节点表示法的树和森林 这种意义上来说更像是模拟做法。 每读入一根树枝A->B, 判断A==B,如果相等,构成自环,可断定不是树。 如果已经有节点指向B了,也可断定不是树,因为树除了根节点入度为零外,其余节点入度为一。不可能有一个以上的结点指向某节点。 若非以上情况,说明这根树枝是合法的,将B节点指向A节点。 在全部数据输入完毕后。原创 2009-09-16 18:07:00 · 816 阅读 · 0 评论 -
POJ 1988 并查集的应用 很好地体现了并查集的一些特点
这道题又是并查集并查集可以解决这一类问题:问题的开始 所有元素之间是没有关系的随着问题的进行 元素之间不断地集合在一起,变成新的集合这种问题很方便地可以用并查集来描述。这个问题也是这样。不过,由于问题的性质,这里的并查集结点中存储一个表示节点在集合内关系的值是不够的,需要两个,CubeBelow和CubeInStack。另外,这道题很好地体现了并和查这两个操作各自所承担原创 2009-09-16 10:25:00 · 1802 阅读 · 0 评论 -
POJ 1182 1703 并查集的应用
1182今天接触了并查集,并查集在数据结构上很简单,虽说是树(二叉树都怕,更别说是树了),但是它是有根节点表示法来表示的,可以用数组模拟,相当的简单。但是用处有很大。并查集主要用于这样的问题,问题中有大量数据,数据之间有简单的关系,而这种关系又带有简单的传递性。如果按照矩阵的方式表示数据间的关系,即用d[i][j]表示i和j之间的关系,空间复杂度O(n^2)显然无法承受,这时就用到了并原创 2009-09-15 14:35:00 · 2291 阅读 · 2 评论 -
POJ 2249
求组合数 CM取N。。原来这就是传说中的组合数学先求AM取N 再除N阶乘的话 肯定越界乘一个数 然后马上除一个数 可以保证数字一直比结果小 递增到结果但是这样又遇到浮点数除法问题 不过这道题里用double就可以解决精度问题代码如下://2249 not submit#include using namespace std;int main(){原创 2009-09-08 11:51:00 · 1198 阅读 · 0 评论 -
POJ 1528
Nothing to say #include using namespace std;int main(){ int num[101]; int len = 0; for (int i = 0;i < 100;i++) { scanf("%d",&num[i]); if(num[i]==0) { len = i;原创 2009-09-05 17:11:00 · 913 阅读 · 0 评论 -
POJ 1565 水 模拟
水的很彻底#include #include #include using namespace std;int main(){ string skew; while (cin>>skew&&skew!="0") { unsigned long result = 0; string::iterator it = skew.end()-1;原创 2009-09-05 13:47:00 · 820 阅读 · 0 评论