- 博客(69)
- 收藏
- 关注
原创 求职小记
写点东西来记录一下自己的求职过程。大四对很多学生来说都是繁忙的一年,这种繁忙甚至从大三第二学期就开始了。三月份开始实习招聘,当时对这个没有很大的关注,因此错过了网易等公司的实习生招聘。四月参加了腾讯的实习生招聘,报的是应用开发这个方向,因为里面写了C++和C#应用开发,我对这个比较有兴趣。笔试后感觉不太好,不过还是收到了一面通知。一面时候看到自己笔试成绩是59,
2013-01-20 15:35:14
1057
原创 POJ2240 套汇(单源最短路径)
给定N种货币以及它们之间的一些兑换率,问是否存在套汇的可能,使某种货币的金钱经过套汇之后变得更多。简单的单源最短路径问题,把每种货币看成一个点,点的初始值只需随便指定一个大于0的数,然后使用bellman-ford算法判定某个点的金钱是否可以无限增多,即是否存在正环。#include #include #include #include using namespace std;
2012-12-12 21:38:48
1888
原创 POJ1860 货币兑换(单源最短路径)
给定N种货币,某些货币之间可以相互兑换,现在给定一些兑换规则,问能否从某一种货币开始兑换,经过一些中间货币之后,最后兑换回这种货币,并且得到的钱比之前的多。可以把初始兑换的货币看成源点,采用bellman-ford进行求解,若可以实现要求,则说明图中存在可以无限增大的环,这个可以通过bellman-ford算法判断环是否存在求出来,若在求解过程中发现已经兑换回原货币,并且钱比之前多,则可以直接
2012-12-12 10:55:03
7470
原创 POJ3615 跨栏最大高度(多源最短路径)
有N个地点,它们之间存在M条单向路径,每条路径中间有一个栏。现在给定一些起点和终点,要求找出它们之间的一条路径,使路径经过的栏的高度的最大值最小。简单的多源最短路径,把路径值变成经过的最大高度值,用FLOYD算法更新每对点之间的最大高度值,然后对于每个起点和终点输出它们之间的最大高度值,若无法从起点到达终点,则输出-1。#include #include #include using
2012-12-11 22:41:23
882
原创 POJ3037 滑雪(单源最短路径)
给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值,从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为"A的速度*2^(A的高度值-B的高度值)",而A点移动到B点所用的时间则是A点开始移动的速度值的倒数。提供网格的长和宽,每个点的高度,以及在左上角的点的出发速度,问从左上角的点到右下角的点最少需要多少时间。由于2^(h1-h
2012-12-10 23:55:12
1784
1
原创 POJ1125 股票经济人通信网络(多源最短路径)
有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint。简单的多源最短路径问题,用floyd算法求出所有存在的路径,然后对每个人判断是否可以由他来传递以及传递的时间,取最小的那个即可。#include #include #in
2012-12-10 10:17:10
3066
原创 POJ1797 道路可承受的最大重量(单源最短路径变形)
有编号为1-N的地点,它们之间存在一些双向路径,每条路径有它的最大可承受重量,现在要从编号为1的地方向编号为N的地方运送货物。问运送的货物的最大重量。采用类似最短路径的思想,把到达每个点的最短路径变成到达每个点的货物的最大重量,采用dijkstra或spfa运行一遍,把最后一个点的最大重量输出即可。#include #include #include #include using
2012-12-09 22:15:34
1169
原创 POJ1724 价格合适的最短路(广搜BFS)
有编号为1-N的城市,这些城市之间存在一些单向路径,通过某条路径需要支付与路径长度一样的金币。BOB要从城市1到城市N,但他的金币数是有限的,现在要求找出从第1个城市到第N个城市的一条路径,既满足BOB支付得起路费,又满足总路径长度最小。有点类似最短路,但因为有两个约束条件,所以说成广搜更加合适。维护一个优先队列,队列中存放的状态包括到达某个点剩下的金币和走过的路径长度,其中剩下的金币数必须为
2012-12-09 21:31:49
1875
原创 POJ1511 最小总费用(单源最短路径)
有编号为1-N的车站和学生,现在要从第一个车站开始把学生运输到相应的车站,然后把所有学生从相应的车站运回第一个车站,要求运输的总费用的最小值。从第一个车站往其他车站运送学生的最小总费用其实就是以第一个车站为源点的所有最短路径的和。从其他车站运送学生回第一个车站的最小总费用可以通过把所有边逆向之后,再以第一个车站为源点的求所有最短路径的和,因为题目保证可以从任意一个车站去到另一个车站,因此边的方
2012-12-09 00:45:54
979
原创 POJ1062 昂贵的聘礼(单源最短路径+枚举)
有N件物品,每件物品有三种属性(主人的等级、价格、替代品数目),替代品加上较少的金币可以用来交换该物品,但交换过程中最高等级与最低等级不能超过某个数。问为了得到第一件物品,最少需要支付多少钱。可以转换为单源最短路径求解,每条路径由某件物品指向它的替代品,路径长度是优惠的金币数。因为交换过程中等级差不能超过某个数m,因此可以采用枚举等级区间来解决这个问题,每个区间为[a, a+m],a的取值范围
2012-12-08 23:31:30
688
原创 POJ1502 信息传递(单源最短路径)
N个处理器要进行信息传递,处理器i传递信息给自己不需要时间,处理器i与处理器j之间相互传递信息的时间是一样的,不同处理器之间传递信息所需要的时间由一个矩阵的下三角给出。若矩阵对应位置为x,则说明相应的两个处理器之间无法传递信息。求从第一个处理器传递信息到其他所有处理器最少需要多少时间。特殊处理一下值为x的情况,建立邻接阵,运用单源最短路径算法求出第一个处理器到其他所有处理器的最短传递信息时间,
2012-12-08 12:48:00
4412
原创 POJ1135 多米诺效应(单源最短路径+枚举)
有N个关键的多米诺骨牌,这些牌通过一些路径相连接,这些路径是由一排其他骨牌构成的。已知每一条路径上的骨牌倒下需要的时间。现在从把编号为1的关键骨牌推倒,问多长时间后所有的骨牌(包括关键牌和它们之间的路径上的骨牌)都倒下,时间精确到小数点后一位。骨牌可以往两个方向倒,因此路径都是双向的。可以把N个关键牌抽象为N个点,路径抽象为点之间的边。然后通过求单源最短路径的算法求出从第一个关键牌到其他关键牌
2012-12-08 12:23:07
1952
原创 POJ3249 工作难题(DAG有向无环图的单源最短路径)
有N个城市,它们之间存在一些单向路径,若可以从城市i到城市j,则一定无法从城市j到达城市i,只出不入的城市称为源点城市,只入不出的城市称为终点城市。已知到达某个城市就可以获得或者失去一定的钱财。现在狗先生从某个源点出发,到达某个终点停止,他想拥有尽量多的钱财。要求给出最多的钱财是多少。题目给定的是一个有向无环图。最多的钱财可以转换成最短路径问题,每条边的权重其实就是到达该边的终点得到或失去的钱
2012-12-07 20:53:01
1766
原创 POJ2387 最短回家路径(单源最短路径)
给定N个点以及它们之间的一些双向路径,求出从第N个点到第1个点的最短路径。纯粹的单源最短路径题目,图的点最多有1000个,而边最多有2000条(题目数据量不对,数据中可能包含多于2000条边的数据),即边数并没有点数的平方那么多,因此应该考虑使用邻接表存储图,然后采用SPFA或者堆优化的DIJKSTRA求解。#include #include #include using names
2012-12-07 19:01:52
851
原创 POJ3159 最大差距(差分约束系统)
班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] = 0。要求在满足这些条件的情况下,求出p[n] - p[1]的最大值。由p[j] - p[i] 在单源最短路径的算法中有一步是“若mindis[j] > mindis[i] + dis[i][j],则mindis[j] = mi
2012-12-07 12:20:17
3874
原创 POJ3259 回到过去(带负权的单源最短路径)
有N个农场,它们之间有M条普通的双向路径,同时有W条单向“虫洞”,通过普通路径需要花费时间,但通过虫洞却可以回到过去。问能否从任意一个点出发,通过某些普通路径或者“虫洞”再回到起始位置,使到达的时间早于出发的时间。这是带负权的单源最短路径的入门题,按题目给定的边建好图,从任意一点起点开始,使用Bellman-Ford算法运行一遍,判断有没有回路就可以了。#include #include
2012-12-06 22:15:30
818
原创 POJ3268 牛的最长来回时间(单源最短路径)
有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。每头牛返回的最短时间很简单就可以算出来,这相当于从目标牛为起点求单源最短路径。但每头牛出发到目标牛的最短时间无法直接算出来,稍微转换一下,发现这个最短时间其实可以通过把所有的边取反向,然后再从目标牛求一次单源最短路径得到。得到这两个最短路径
2012-12-05 21:42:33
4564
原创 POJ1094 字母排序(拓扑排序)
对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序。利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,就要进行一次拓扑排序,如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。若读入所有关系之后依然无法确定唯一关
2012-12-05 16:28:14
4965
原创 POJ3687 球的标签(拓扑排序+优先队列)
给定N个球,这些球的编号分别是1-N中的某个数字,它们的重量也分别是1-N中的某个数字,任意两个球的编号和重量不相等。给定一些类似a这道题是一个拓扑排序问题,把每个编号的球看成一个点,把约束看成点之间的边,构造出一个有向图进行拓扑排序。但由于题目要求输出的答案必须是编号小的球重量尽量轻,因此如果直接拓扑排序,则得到的答案不满足条件。解决的方法是改变每条边的方向,并且使用优先队列来存放入度为
2012-12-04 23:45:15
1760
原创 POJ2367 拓扑排序入门
拓扑排序入门题,此题基本正常的方法都能过,不需要判断是否存在环的情况。#include #include #include using namespace std;const int N = 105;struct Edge{ int pos; int next;};int n;int indeg[N];Edge edge[N * N];int cur;int ne
2012-12-04 21:13:04
1665
原创 优先队列
优先队列是一种特殊的队列,它同样具备入队与出队两种基本操作,但每次出队的元素都是队列中最大(最小)的元素,这里的最大与最小相当于优先级,因此这种队列叫优先队列。优先队列的实现方式不唯一,其中有一种是用堆实现的。对于堆实现的优先队列,它的入队操作相当于在堆的最后一个元素之后加入一个新元素,然后逐步往上浮动直到不需浮动为止;而出队操作则是保存堆顶的元素,然后把堆的最后一个元素放到第一个元素的位置上
2012-12-04 15:56:27
621
原创 常见的字符串哈希函数
const int MOD = 10007;unsigned int RSHash(const char* str){ unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; while (*str) { hash = hash * a + *str++; a *= b; } ret
2012-12-02 00:09:29
1039
2
原创 POJ2002 正方形的个数(二维点的哈希)
给定N个点,求出这些点一共可以构成多少个正方形。若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标。对于特定的A和B坐标,C和D可以在线段AB的左边或者右边,即有两种情况。因此只需要枚举点A和点B,然后计算出两种对应的C和D的坐标,判断是否存在即可。这样计算完之后得到的答案是正确答案的4倍,因为正方形的4条边都枚举了,所以答案要右移两位。
2012-12-01 23:11:12
5557
1
原创 POJ1840 解方程(数的哈希)
给定a1, a2, a3, a4, a5,求符合条件的解(x1, x2, x3, x4, x5)的个数,使得a1*x1^3 + a2*x2^3 + a3*x3^3 + a4*x4^3 + a5*x5^3 = 0。其中-50 x1-x5各有100个可能值,相互的解法是使用5重循环逐一判断,但这样用的时间太长了。因此可以把它们分为两部分(x1, x2)和(x3, x4, x5),求出所有的sum
2012-12-01 20:13:02
825
原创 POJ2785 和为0的组合数(数的哈希)
给定4个组合A,B,C,D,这四个组合里面的元素数目相等。要求找出所有的序列(a, b, c, d),四个数分别来自A,B,C,D四个组合,使得a + b + c + d = 0,输出这样的序列的总数。若两个满足条件的序列是完全相同的,它们也算是不同的序列,因为A,B,C,D中可能含有相同的元素。解题思路很简单,取所有的(a, b)序列进行哈希,以a+b作为键,分别映射到非负数和负数两个哈希表
2012-12-01 17:12:32
1025
原创 POJ3274 牛的属性和(数的哈希)
给定多头牛的属性,每头牛的属性由一个非负数表示,该数的二进制表示不会超过K位,它的二进制表示的每一位若为1则表示该牛有对应的第i种属性,若为0则表示没有该属性。对于给定的牛的顺序,要求输出某一段子序列的长度,这个子序列中的牛的K个属性对应相加以后全部相等。假设n=3, k = 3输入的3个数变成的二进制分别为(a1, a2, a3), (b1, b2, b3), (c1, c2, c3
2012-12-01 16:02:48
3390
1
原创 USACO历年比赛的数据和解题报告
http://ace.delos.com/MAR07 表示07年三月的比赛,把最后的部分改成”月份+年份“就可以了
2012-12-01 15:43:45
3109
2
原创 POJ3349 重复的雪花(数字哈希)
每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。简单的数字哈希,要注意的是每种雪花可以由多种数字组合表示。比如输入的是1 2 3 4 5 6,则2 3 4 5 6 1,3 4 5 6 1 2,……,6 5 4 3 2 1,5 4 3 2 1 6等都是相同形状的。因此可以在读入一个雪花
2012-11-30 21:04:11
6217
原创 HDU1880 简单字符串哈希
给定多个魔咒以及对应的效果,要求对于后面的魔咒或效果,及时给出对应的效果或魔咒。建立两张哈希表直接哈希就可以了。输入需要稍微处理一下。哈希函数计算出来的值要保证是正的,否则读数组会出错。#include #include #include using namespace std;const int N = 100010;const int H = 100007;struct
2012-11-30 19:54:48
1736
原创 POJ2796 区间最大参考值
给定一个数组,定义某个区间的参考值为:区间所有元素的和*区间最小元素。求该数组中的最大参考值以及对应的区间。设某个区间所有元素的和为height,区间最小元素为width,则对于单个元素的区间,height = width = 元素的值。建立一个单调递增的栈。从第一个元素开始入栈,每个元素入栈之前必须先从栈顶开始删除大于或等于它的元素,把删除的所有元素的height累加到当前元素的he
2012-11-27 21:19:09
3971
原创 POJ2082 最大矩形面积
基本与POJ2559一样,只是初始矩形的宽度不再是1。思路与POJ2559完全一致。详见http://blog.csdn.net/alongela/article/details/8230739。#include #include using namespace std;const int N = 50005;struct Elem{ int height; int wi
2012-11-27 18:28:25
2439
原创 POJ2559 最大矩形面积
给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。建立一个单调递增栈,所有元素各进栈和出栈一次即可。每个元素出栈的时候更新最大的矩形面积。设栈内的元素为一个二元组(x, y),x表示矩形的高度,y表示矩形的宽度。若原始矩形高度分别为
2012-11-27 16:58:19
12131
3
原创 POJ3250 牛的视野(单调栈)
一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。把要求作一下转换,其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就
2012-11-27 13:38:37
6756
3
原创 POJ2823 滑动窗口中元素的最值(单调队列)
给定一个大小已知的数组以及一个大小已知的滑动窗口,窗口每个时刻向后移动一位,求出每个时刻窗口中数字的最大值和最小值。这个题是单调队列的入门题。求最大值:建立一个单调递减队列,元素从左到右依次入队,入队之前必须从队列尾部开始删除那些比当前入队元素小或者相等的元素,直到遇到一个比当前入队元素大的元素,或者队列为空为止。若此时队列的大小超过窗口值,则从队头删除元素,直到队列大小小入窗口值为止。然
2012-11-27 13:30:39
8822
3
原创 单调栈
单调栈与单调队列很相似。首先栈是后进先出的,单调性指的是严格的递增或者递减。单调栈有以下两个性质:1、若是单调递增栈,则从栈顶到栈底的元素是严格递增的。若是单调递减栈,则从栈顶到栈底的元素是严格递减的。2、越靠近栈顶的元素越后进栈。单调栈与单调队列不同的地方在于栈只能在栈顶操作,因此一般在应用单调栈的地方不限定它的大小,否则会造成元素无法进栈。元素进栈过程:对于单调递增栈,若当
2012-11-26 21:59:20
16462
原创 单调队列
队列是一种先进先出的数据结构,单调指的是数学中的单调性,包括严格的递增或者递减。单调队列指的就是严格符合单调性的队列,它有两个性质:1、对于单调递增队列,从队头到队尾的元素在某种比较标准下是严格递增的,比如q(1, 2, 3, 4, 5)。对于单调递减队列,从队头到队尾的元素在某种比较标准下是严格递减的,比如q(5, 4, 3, 2, 1)。2、排在前面的元素必定比排在后面的元素先进队
2012-11-26 21:36:32
1034
原创 POJ3294 出现在至少k个字符串中的最长子串
给定n个字符串,求出现在多于n/2个字符串中的最大长度的子串。用朴素的搜索方法肯定不能满足时间要求。因此还是使用后缀数组。首先把问题变成判定性问题,即长度为某个值的满足条件的子串是否存在。这样就可以使用二分来求解。接着是把n个字符串用某个字符连接起来。计算出sa数组和height数组。对于每个需要判定的长度,对height数组进行分组,对每个分组分别进行统计,如果该分组中包含了多于n/
2012-11-24 01:03:03
3476
1
原创 POJ3974 求字符串的最长回文子串的长度
回文串:如果某个字符串从左往右看与从右往左看是一样的,则称该字符串为回文串。最长回文子串:求解一个字符串,它是某个给定字符串的子串,并且是回文串。本题要求对于给定的字符串,求出它的最长回文子串的长度。可以采用Manacher算法在O(n)时间内求解。#include #include #include #include using namespace std;const
2012-11-21 15:31:24
6217
原创 Manacher算法求最长回文子串的长度
const int N = 100005;char str[N]; //原字符串char s[N << 1]; //用'#'作为间隔填充之后的字符串int p[N << 1]; //p[i]表示以第i个字符为中心的回文子串的长度加1int len;int ans; //最长回文子串的长度void Manacher(){ int i; int mx; //mx表示当前回文子串
2012-11-21 15:23:57
867
原创 POJ2185 最小覆盖矩阵
给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵。最小覆盖矩阵类似于最小覆盖子串,只不过是扩展到二维而已。最小覆盖子串必定是原串的前缀,对于矩阵,可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度。同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了。这里有一个地方要注意,如果求最小公倍数的过程中发现“行
2012-11-18 20:09:39
3540
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人