摘要: 问题给定你一个数n,让你找出一个能被n整除的由0和1组成的十进制数。存在多解输出任一个分析一看到题就感觉是数论,但是不存在这样的定理。所以想到了搜索,为了尽可能早的搜到,采取宽度优先搜索。那么如何表示状态和判重呢。如果两个数对n的余数相等,我们可以认为这是一个状态,根据同余定理: (a*10) mod n=((a mod n)*10 )mod n (a*10+1)mod n=((a mod n)*10+1)mod n所以每次只需对余数计算即可,从首位开始搜索,共需搜索n个状态,直到余数等于零。codeprogram liukee;type pig=record num:int64; ys:lo 阅读全文
posted @ 2011-04-19 12:07 liukee 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 问题给定你一个数列,a1~an,其中n<=100005,给定m(M<=50000)个形如“x y k”的询问,让你输出x到y这段区间中第k小的数是多少。分析如果用快排,时间复杂度是nmlogn一定会超时,那么只好用二叉排序树进行动态维护,时间复杂度接近mlogn,但是单纯的bst还是很有可能超时,所以用treap维护这棵平衡树。基于贪心的思想,尽量少的对树进行操作,对区间的首端点排序,之后按顺序对每个区间进行操作,如果当前区间的数不在已构树中,就加入这些新节点,如果树中多出不在区间中的节点则删去。这样操作m次即可。只需对最基本的平衡树操作多开一个域,记录一个节点的左边有多少儿子即比 阅读全文
posted @ 2011-04-15 17:00 liukee 阅读(566) 评论(1) 推荐(0) 编辑
摘要: Treap的构建和使用BY liukeke一、定义叶子我没有找到定义,只是满天飞的人们提到的词,Treap=Tree+Heap,就是让二叉排序树在Heap的规则下进行一些简单的翻转,由于Heap翻转所以靠的关键字段Aux是随机生成的,所以在满足BST的同时,平衡又是随即建立起来的,消除了BST由于有序数据的插入退化的情况,所以Treap在有些地方也被称作随机二叉树(Randomize Binary Sort Tree)在Treap的翻转中,只有两种翻转:左旋和右旋,比起AVL树和扩展树(Splay Tree)的翻转要简单得多,少得多,很容易掌握。而且由于随机化,不会出现退化现象,平均的插入、删 阅读全文
posted @ 2011-04-14 09:15 liukee 阅读(964) 评论(0) 推荐(0) 编辑
摘要: 问题给定你一个n*m的图,图中有些‘*’点,其他是‘0’点,在每个‘*’点可以建雷达,每个雷达可以覆盖其上下左右四个方向的‘*’点之一,问你最少建多少雷达,可以将这些‘*’点全部覆盖。分析二分图,构图,如果我们把每个‘*’点虚拟成一个节点,分布在二分图的两侧。然后,如果两点能相互覆盖,我们就在两点之间连一条边。要求的问题就转化成了,二分图最小边覆盖!为什么是二分图呢,以为每个点只能覆盖出自身之外的一个节点,这恰好满足匹配的定义。怎样求解二分图中的最小边覆盖呢。我们知道,一个匹配可以覆盖到2个不同的节点,那么二分图最大匹配覆盖到的节点数=最大匹配数*2。还没有被覆盖到的节点=总共的节点数-最大匹 阅读全文
posted @ 2011-03-20 20:55 liukee 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 问题给你一个n*n的图,上面有m个需要清楚的障碍,每次可以消除一行或者一列上的障碍物。问你最少用多少次,可以消除图上的所有障碍。分析关键是构图,我们将原图抽象成一个二分图:左边是x,右边是y,如果(x,y)上有障碍物,那么就连一条边。我们的任务是消除障碍物,也就是说,用最少的点覆盖图中所有的边!也就是求二分图的最小点集覆盖!我们用到一个强大的定理:二分图最小点集覆盖数=最大匹配数,网上有好多证明。这里大体说一种思路,如果最大匹配的边涉及到的点无法将所有边覆盖,那么当前匹配一定不是最大匹配!codeprogram liukee;var a:array[1..1200,0..1200] of lo 阅读全文
posted @ 2011-03-20 20:46 liukee 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 问题描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。 在详细考察了 阅读全文
posted @ 2011-03-10 09:13 liukee 阅读(1769) 评论(0) 推荐(0) 编辑
摘要: 问题描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一 的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 1 2 3 4 5 …… N 乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型 的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择 一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用 阅读全文
posted @ 2011-03-06 20:18 liukee 阅读(789) 评论(0) 推荐(0) 编辑
摘要: 问题S在迷宫中找A,找到A之后就把它同化,也会帮着S找剩下的A。。就是这样。。给你的是一个字符组成的图……分析正常人会想到搜索……当然,但是只是搜索很难实现,仔细读题,我们发现,其实质是在求最小生成树!!!那么用宽搜的方法计算每两点之间的距离,重新构图,prim即可。为了方便查找,开一个which数组。点的坐标做下标,对应第几个点是数组中的值。数据特别恶心,读入长和宽之后会出现n多莫名其妙的空格,要单独读图的第一行!!!codeView Code program liukee;type xz=record x:longint; y:longint; z:longint;... 阅读全文
posted @ 2011-03-06 19:34 liukee 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 问题Description年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东 阅读全文
posted @ 2011-03-06 19:24 liukee 阅读(355) 评论(0) 推荐(1) 编辑
摘要: 问题给定你一个有向图,让你求两点之间所有可行路径上的最大值之中的最小值。多组数据分析经典的floyd算法的变形,a[i,j]表示i,j两点之间所有可行路径上的最大值之中的最小值,我们可以的到这样的方程a[i,j]:=min{a[i,j],max{a[i,k],a[k,j]}};很好理解。codeprogram liukee;var a:array[0..201,0..201] of double; n,tt:longint;procedure init;var x,y:array[0..202] of double; i,j:longint;begin fillchar(x,sizeof(x) 阅读全文
posted @ 2011-03-06 19:15 liukee 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 问题给定多组数据,每组数据中有多个大小关系,让你判断是否能产生一个拓扑序列,如果可以,输出在第几个关系之后得到,并输出这个序列。如果不可以,输出在第几个关系之后无解;如果存在多解,按题目要求输出。分析就是拓扑排序,加队列优化,再加一点改进。每次读入关系之后进行拓扑排序。我们知道,如果一个序列能得到拓扑排序的序列,那么在每步有且仅有一个节点的入度为0,如果不存在入度为零的点,则无解。如果入度为零的点的个数多于一个,则存在多解。对于队列拓扑排序的原理我们了解,每次选取队首元素是,判断当前队伍中元素的个数,如果多于一个,暂时标记多解(可能在后面的过程中出现无解)。那么什么时候队列中不在有元素捏?就是 阅读全文
posted @ 2011-03-06 19:07 liukee 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 排序算法主要有:插入排序,选择排序,冒泡排序,归并排序等,当然包括堆排序和二叉树排序,后两种算法很少用到。各种排序算法之间的比较,主要从以下几个方面综合考虑:1.时间复杂性;2.空间复杂性;3.稳定性;4.待排序记录数n的大小;6.记录本身信息量的大小。下面就这些方面逐一讨论,再综合得出结论。时间复杂性1、 直接插入排序在直接插入排序中,共需要进行(n-1)次元素的插入,每一次插入最少需要比较一次和移动两次,最多需要比较(i+1)次,移动(i+2)次,平均需要比较1+i/2次和移动2+i/2次。因此直接插入排序的复杂度为o(n2)。2、 堆排序,时间复杂度o(nlogn)3、 冒泡排序时间复杂 阅读全文
posted @ 2011-02-27 20:51 liukee 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 问题http://poj.org/problem?id=3259分析既有虫洞又有普通道路,我们把虫洞看成是一条负权路,问题就转化成求一个图中是否存在负权回路,有两种算法:1.bellman_ford算法Bellman-Ford算法流程分为三个阶段:(1)初始化:将除源点外的所有顶点的最短距离估计值 d[v] ←+∞, d[s] ←0;(2)迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点的最短距离估计值逐步逼近其最短距离;(运行|v|-1次)(3)检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解;否则算法返回 阅读全文
posted @ 2011-02-27 20:13 liukee 阅读(441) 评论(1) 推荐(1) 编辑
摘要: 问题Description 一些货币兑换点正在我们的城市工作。我们假设每个兑换点尤其擅长兑换两种特定的货币,并且只进行对这些货币的兑换。可能有一些兑换点专门兑换相同的货币对。每个兑换点都有自己的汇率,货币A到货币B的汇率是你用1货币A换到的货币B的数量。每个兑换点也有一些佣金,即为你需要为你的兑换行动支付的金额。佣金总是从源货币扣除。 例如,如果你想要在汇率为29.75,并且佣金为0.39的兑换点将100美元兑换成俄罗斯卢布,你将会得到(100-0.39)*29.75=2963.3975卢布。 你有N种不同的货币可以在我们的城市进行兑换。我们为每一种货币制定从1到N的唯一一个整数。每个兑换点可 阅读全文
posted @ 2011-02-27 19:25 liukee 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 不错的搜索题,原题目如下:http://poj.org/problem?id=1753问题就是翻转棋,反当前这个会引起其周围棋子的变化,就是取反的过程。问你经过一个最小反转次数能否得到全都是黑棋,或全是白棋的情况,如果不能,输出impossible。分析一看就知道是搜索,每个棋两种状态,那么共有2^16=65536种状态,所以想到了位运算。用每个二进制位代表棋子,定义坐标和第i个棋子的转换方法(代码中有,不再多说)。利用xor运算进行变换(xor 0则不变,xor 1 则取反)。开一个哈希表判重,即可。codeView Code program liukee;type lkj=record l 阅读全文
posted @ 2011-02-24 08:28 liukee 阅读(265) 评论(0) 推荐(0) 编辑