最近更新日期:2017-08-11
干脆把自己平日做的题放在一篇文章里吧。不然太分散了。
POJ: 1163 1182 1258 1273 1979 2236 2388 3069 3176 3253 3617
XOJ: 1004 1005 1022 1061 1062 1075 1078 1316
POJ
1163
题目
http://poj.org/problem?id=1163
思路
见下面POJ-3176题分析
提交
|
|
1182
题目
http://poj.org/problem?id=1182
思路
并查集使用。输入的x,有三种种类A,B,C,分别用x,x+n,x+2n来代表。
输入后,先判断x,y是否符合范围要求。
第一种关系中:x和y是同一种种类。即union_set(x,y),union_set(x+n,y+n),union_set(x+2n,y+2n)。在执行union_set()之前,要看是否存在矛盾关系,即判断same_set(x,y+n) || same_set(x,y+2n) || same_set(x+n,y) || same_set(x+n,y+2n) || same_set(x+2n,y) || same_set(x+2n,y+n)。
第二种关系中;x吃y。即union_set(x,y+n),union_set(x+n,y+2n),union_set(x+3n,y).。在执行union_set()之前,要看是否存在矛盾关系,即判断same_set(x,y)|| same_set(x,y+2n) || same_set(x+n,y+n) ||same_set(x+n,y) || same_set(x+2n,y+n) || same_set(x+2n,y+2n)。
另外数组如果开小的话,会导致runtime error。。。
提交
|
|
1258
题目
http://poj.org/problem?id=1258
思路
最小生成树。
提交
|
|
1273
题目
http://poj.org/problem?id=1273
思路
模板题目,直接求最大流就可以。
我用了vector来构造邻接表,而这题的输入时一次包含了很多个测试例子。所以每次读完后都需要对邻接表进行初始化,即进行下面的操作:
方法是网上找的,网上说这样清空了元素,但不会回收内存。
提交
|
|
1979
题目
http://poj.org/problem?id=1979
思路
DFS()
提交
|
|
2236
题目
http://poj.org/problem?id=2236
思路
并查集。用结构体数组来作为节点,repair表示是否已经修理过,par表示其父节点。其余利用并查集即可。
提交
|
|
2387
题目
http://poj.org/problem?id=2387
思路
最短路径 + 队列优先 。
这题竟然是先读入边数再读入顶点数,Orz
另外会有 重边, 不过如果用邻接表实现的话,可以不用管,如果邻接矩阵来实现的话,最后矩阵中存储的是从点到点的多条边的最小值。
提交
|
|
2388
题目
http://poj.org/problem?id=2388
思路
先排序,之后打印出中间值。水题。
提交
stl
|
|
快排
|
|
3069
题目
http://poj.org/problem?id=3069
思路
贪心算法。在 while( i < n )
循环中,第一个while循环,找到距离当前点(未覆盖)大于r的第一个点,该点的前一个(i—)做上标记。第二个while循环,从已经标记的点出发,找到距离当前点(已经覆盖)大于r的第一个点,并将其作为下一次大循环的起点。
提交
|
|
3176
题目
http://poj.org/problem?id=3176
思路
二维数组triangle用于保存三角形,二维数组way用于保存路径。
以题目数据为例:
分为三种情况:
- 最左边,只能从上一行的同列来,way[i][j] = way[i-1][j] + triangle[i][j]
- 最右边,只能从上一行的斜对角线来,way[i-1][j-1] + triangle[i][j];
- 中间,可以从上一行的左边或者右边来,way[i][j] = max(way[i-1][j],way[i-1][j-1]) + triangle[i][j];
填表完成后,对最后一行way[n-1][]找出最大值即为答案。
提交
|
|
3253
题目
http://poj.org/problem?id=3253
思路
霍夫曼树的变形。
重点在于对两个最小值相加后对数组的处理。
提交
|
|
3617
题目
http://poj.org/problem?id=3617
思路
贪心算法,每次选择排序靠前的字母加到字符串t中。如果两个排序相同,则看它们的下一个字母的顺序,可以使用一个递归函数来判断。
提交
|
|
XOJ
1004
想法
冒泡等可能会超时。堆排序和快排的复杂度都是 O(nlogn)。课上为了节约时间所以:)
提交
|
|
oj对格式要求好严格…
1005
此题另写一篇文章了。
1022
想法
直接用普通的矩阵乘法就过了,
时间复杂度 O()
提交
|
|
1061
想法
贪心算法。其实就是任务选择问题。
- 按照约会完成时间从早到晚排序
- 选择具有最早完成时间的girl
- 将此girl加入到约会列表中
- 对子问题重复上述问题
- 强烈谴责Ckp
提交
|
|
1062
想法
贪心算法。背包问题。尽量选择面值大的。
将元转换为角,这样都是整数,进行处理更方便。
提交
|
|
1075
思路
直接dijkstra。 采用邻接矩阵存储。
提交
|
|
1078
思路
任意两点间的最短路径问题的变体吧。一旦找出了从某个源点(人)到其他所有人需要的层数时,记录下来,如果有的人与其他所有人都不认识,则该层数是 无穷大(INF)。之后通过循环,找出从每个源点出发所需要的层数,并取最大值。要注意的是 算法求得最短路径 是 经过了几条路径(路径权为 1 ,路径权和即有几条路径),而题目的 层数M 是指 两个人之间还有多少人,即经过了多少个 点, 所以在最后的结果中记得减一。
提交
dijkstra算法
|
|
Floyd-Warshall 算法
|
|
1316
想法
贪心算法。背包问题。有别于0/1背包问题。
每次选取尽量多的单位价值高的物体。
提交
|
|