算法竞赛入门经典(紫书)
文章平均质量分 90
_duadua
这个作者很懒,什么都没留下…
展开
-
入门经典_Chap06_例题[一]:队列,栈,链表的数组实现
前言原创 2017-06-27 17:13:22 · 429 阅读 · 0 评论 -
UVA - 1354 Mobile Computing: 枚举二叉树 位运算枚举子集,枚举子集的子集 回溯
题目点此跳转 There is a mysterious planet called Yaen, whose space is 2-dimensional. There are many beautiful stones on the planet, and the Yaen people love to collect them. They bring the stones back home原创 2017-07-19 14:27:10 · 660 阅读 · 0 评论 -
入门经典_Chap06_例题[三]:图的搜索 Floodfill 拓扑排序 欧拉回路
前言题解如下原创 2017-07-07 10:48:11 · 489 阅读 · 0 评论 -
入门经典_Chap05_习题题解
前言第一题第二题原创 2017-06-24 12:00:16 · 406 阅读 · 0 评论 -
入门经典_Chap06_习题:搜索 数据结构 欧拉回路
前言 A题有一个坑:当输入字符串为空串的时候也需要处理,但是用cin读不进来空串,得改成getline B题~D题是水题题目意思是某国家有V(V≤1000)个城市,每两个城市之间都有一条双向道路直接相连,长度为T。请你找一条最短的道路(起点和终点任意),使得该道路经过E条指定的边。 找出所有的连通块(bfs,dfs都行),对每一个连通块,找出其内度为奇数的顶点的个数(如果此个数小于2则使其为2,此时原创 2017-07-13 00:08:21 · 457 阅读 · 0 评论 -
入门经典_Chap06_例题[四]:最后四题
UVA - 1572 Self-Assembly 思路 有n(n≤40000)种边上带标号的正方形。每条边上的标号要么为一个大写字母后面跟着一个加号或减号,要么为数字00。 当且仅当两条边的字母相同且符号相反时,两条边能拼在一起(00不能和任何边拼在一起,包括另一条标号为00的边)。 假设输入的每种正方形都有无穷多种,而且可以旋转和翻转,你的任务是判断能否组成一个无限大的结原创 2017-07-07 10:46:23 · 371 阅读 · 0 评论 -
入门经典_Chap05_题解总结
总结例题: 第一题主要是排序的一个用法,即可以通过排序确定一定的数据形式,当需要的时候 第二题和第一题有类似的地方,主要是用一个长度为26的数组做一个字母的映射 第三题取模可模拟环状类型 总的来说前三题较为简单 第四题揭示了一个非常重要的知识点,即跨行读取字符的一种方法,以及二进制转换到十进制保存起来的技巧,需要仔细体会一下 第五题和第六题都是原创 2017-04-05 18:42:23 · 704 阅读 · 0 评论 -
入门经典_Chap06_例题[二]:二叉树的指针及数组实现
前言原创 2017-07-03 10:49:20 · 478 阅读 · 0 评论 -
算典05_例题_12_UVA-221
Urban Elevations题意如图所示,有n(n≤100)个建筑物。左侧是俯视图(左上角为建筑物编号,右下角为高度),右侧是从南向北看的正视图。 输入每个建筑物左下角坐标(即x、y坐标的最小值)、宽度(即x方向的长度)、深度(即y方向的长度)和高度(以上数据均为实数) 输出正视图中能看到的所有建筑物,按照左下角x坐标从小到大进行排序。左下角x坐标相同时,按y坐标从小到大排序。题解这一原创 2017-04-20 15:22:01 · 388 阅读 · 0 评论 -
算典05_例题_11_UVA-814
The Letter Carrier’s Rounds题意本题的任务为模拟发送邮件时MTA(邮件传输代理)之间的交互。所谓MTA,就是email地址格式user@mtaname的“后面部分”。当某人从user1@mta1发送给另一个人user2@mta2时,这两个MTA将会通信。如果两个收件人属于同一个MTA,发送者的MTA只需与这个MTA通信一次就可以把邮件发送给这两个人。题解map set原创 2017-04-20 15:11:43 · 404 阅读 · 0 评论 -
算典05_例题_10_UVA-207
PGA Tour Prize Money题意 为PGA(美国职业高尔夫球协会)巡回赛计算奖金。巡回赛分为4轮,其中所有选手都能打前两轮(除非中途取消资格),得分相加(越少越好),前70名(包括并列)晋级(make the cut)。所有晋级选手再打两轮,前70名(包括并列)有奖金。组委会事 先会公布每个名次能拿的奖金比例。例如,若冠军比例是18%,总奖金是$1000000,则冠军奖金是$18原创 2017-04-20 15:06:47 · 411 阅读 · 0 评论 -
算典05_例题_07_UVA-136
Ugly Numbers题意丑数的定义是一个数的质因数只有2,3,5这三个数 1也是丑数 题目让你求第1500个丑数题解如果一个数i是丑数,那么2i, 3i, 5i也是丑数 因为要求第1500个丑数,所以要使用优先队列从小到大找 一个丑数出队,与其相关的三个丑数入队,直到第1500个出队即可 要注意的是第1500个丑数已经很大了,int存不下了,要用long long 所以记录一个数有没原创 2017-04-02 20:15:21 · 395 阅读 · 0 评论 -
算典05_例题_09_UVA-1592
Database题意 输入一个n行m列的数据库(1≤n≤10000,1≤i≤10),是否存在两个不同行r1,r2和两个不同列c1,c2,使得这两行和这两列相同(即(r1,c1)和(r2,c1)相同,(r1,c2)和(r2,c2)相同)。题解直接四层循环绝对会超时,不是吓唬你 列数比较少(<=10),遍历两个列数比较好 然后从上到下遍历每一行,用一个map映射两列上的字符串到一个行数 如果原创 2017-04-05 15:01:46 · 367 阅读 · 0 评论 -
算典04_习题_04_UVA-253
骰子涂色题意 输入两个骰子,判断二者是否等价题解枚举旋转即可 固定一个对面,旋转其余的四个面(这样旋转了四次),总共6个面,总共枚举24次即可判断#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn = 1e3 + 5;原创 2017-03-27 14:43:26 · 359 阅读 · 0 评论 -
算典04_习题_02_UVA-201
正方形 题意 给你一个正方形,每行和每列都有n个点,有些点是相连的,有些点是不相连的,一个点只会跟它上下左右四个点中的一些点相连。让你统计总共有多少个正方形,并输出各种规模的正方形各有多少个题解 由于题目规模较小,直接暴力枚举即可,即分别枚举每种规模的正方形出现的次数#include <iostream>#include <cstdio>#include <cstring>usin原创 2017-03-27 14:23:47 · 299 阅读 · 0 评论 -
算典04_习题_01_UVA-1589
象棋 题意 和象棋的规则一样,只不过只有将帅和车马炮,给你一个红棋将军的局势,判断能不能将死题解 标记出车马炮可以进攻到的地方,然后判断将是否还可以移动即可原创 2017-03-27 14:14:57 · 409 阅读 · 0 评论 -
UVA - 129 Krypton Factor : 回溯
题目点此跳转You have been employed by the organisers of a Super Krypton Factor Contest in which contestants have very high mental and physical abilities. In one section of the contest the contestants are tes原创 2017-07-18 16:06:29 · 344 阅读 · 0 评论 -
UVA - 10603 Fill:状态空间搜索
题目点此跳转 There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not greater than 200). The first and the second jug are initially empty, while the third is compl原创 2017-07-21 20:35:10 · 336 阅读 · 0 评论 -
UVA - 140 Bandwidth: 暴力 回溯
题目点此跳转 Given a graph (V, E) where V is a set of nodes and E is a set of arcs in V ×V , and an ordering on the elements in V , then the bandwidth of a node v is defined as the maximum distance in the原创 2017-07-19 11:11:31 · 407 阅读 · 0 评论 -
入门经典_Chap08_题解总结:极角扫描法 滑动窗口 单调队列 单调栈
bulabula原创 2017-08-06 23:50:28 · 518 阅读 · 0 评论 -
POJ - 1077 Eight : 八数码 -- 哈唏 康托展开 双向bfs A* IDA*
前言做完这道题,感觉整个人都完整了。 这道题所能涉及到的知识点特别多,列举如下: STL判重 Hash判重 康托展开 双向bfs A* IDA* 每一种知识点分别对应不同的版本,下面的题解按照以上顺序给出各个版本。 另外有个比较好的博客,可以根据这个博客给出的顺序一步一步实现代码,再此感谢此大牛博主。 点此转到 -> 八数码的八境界http:/原创 2017-07-21 16:48:15 · 1025 阅读 · 4 评论 -
康托展开Cantor expansion 康托逆展开
康托展开定义对于n位数的某个排列s[0,n-1],有X=a[n]∗(n−1)!+a[n−1]∗(n−2)!+...+a[i]∗(i−1)!+...+a[1]∗0!X 为 s 在整个全排列中的位置-1 a[i] 表示在i位后面出现的小于s[i]的数 的个数解释通过上面的定义我们可以知道,康托展开的作用是找出一个排列在全排列中的位置. 公式也特别容易理解:在它后面且比它小的数都可以放在它前面来一原创 2017-07-21 18:26:23 · 427 阅读 · 0 评论 -
入门经典_Chap07_题解总结:枚举, 回溯, 状态空间搜索, IDA*
总结 枚举:注意枚举的对象和规模. 对象主要有排列, 子集, 状态, 转移等; 规模在原则上是要尽量缩小的,为此有时可能需要分类枚举. 回溯:剪枝是灵魂, 同时注意避免不必要的判断. 状态空间搜索: 一道八数码问题说明一切 => 点此转到八数码http://blog.csdn.net/a27038/article/details/75645835 迭代加深(ID)或(IDA*)原创 2017-07-27 11:17:57 · 441 阅读 · 0 评论 -
UVA - 1602 Lattice Animals : 完备信息 set
题目点此跳转 Lattice animal is a set of connected sites on a lattice. Lattice animals on a square lattice are especially popular subject of study and are also known as polyominoes. Polyomino is usually rep原创 2017-07-27 10:48:18 · 465 阅读 · 0 评论 -
UVA - 1374 Power Calculus :IDA* 各种优化
题目意思是输入正整数n(1≤n≤1000),问最少需要几次乘除法可以从x得到xn ?例如,x31 需要6次:。计算过程中x的指数应当总是正整数(如x -3 =x/x4 是不允许的)。在 还是用IDA*, 将当前得到的指数集合作为状态, 转移就是指数的相加减, 但是不用枚举所有的指数相加减, 一种做法是每次用刚刚获得的那个数进行枚举其他的指数. 剪枝:d表示当前深度,maxd表示深度上限,则如果当前序列最大的数原创 2017-07-27 10:30:43 · 399 阅读 · 0 评论 -
UVA - 1343 The Rotation Game : IDA*
题目意思是:如图所示形状的棋盘上分别有8个1、2、3,要往A~H方向旋转棋盘,使中间8个方格数字相同。图(a)进行A操作后变为图(b),再进行C操作后变为图(c),这正是一个目标状态(因为中间8个方格数字相同)。要求旋转次数最少。如果有多解,操作序列的字典序应尽量小。 典型的状态空间搜索, 这里使用IDA*, h值使用中间8个方格出现最多的数字的出现次数. 这样每次操作最多会使h值增加1,所以当搜索深度ma原创 2017-07-27 09:26:15 · 409 阅读 · 0 评论 -
UVA - 12325 Zombie's Treasure Chest : 分类枚举 思维题
题目点此跳转 Some brave warriors come to a lost village. They are very lucky and find a lot of treasures and a big treasure chest, but with angry zombies. The warriors are so brave that they decide to原创 2017-07-26 20:43:21 · 386 阅读 · 0 评论 -
UVA - 11212 Editing a Book : IDA*
题目意思是你有一篇由n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…, n。可以用Ctrl+X(剪切) 和Ctrl+V(粘贴)快捷键来完成任务。每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴。注意,剪贴板只有一个,所以不能连续剪切两次,只能剪切和粘贴交替。 例如,为了将{2,4,1,5,3,6}变为升序,可以剪切1将其放到2前,然后剪切3将其放到4前。再如,对于排列{3,4,5,1,2},只需一原创 2017-07-26 20:30:32 · 394 阅读 · 0 评论 -
UVA - 1608 Non-boring sequences : 分治
题目点此跳转思路 题目意思是如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列是不无聊(non-boring)的。输入一个n(n≤200000)个元素的序列A(各个元素均为10 9 以内的非负整数),判断它是不是不无聊的。 分治法 在整个A[1,, n]里找到一个只出现一次的元素,记为A[p],然后以此为分治点, 分别对A[1,, p-1] 和A[p+1,, n]执行同样的操原创 2017-08-03 20:15:30 · 352 阅读 · 0 评论 -
UVA - 12627 Erratic Expansion : 递归
题目点此跳转思路 题目意思是(书上原话)一开始有一个红气球。每小时后,一个红气球会变成3个红气球和一个蓝气球,一个蓝气球会变成4个蓝气球,如图所示分别是经过0, 1, 2, 3小时后的情况。经过k小时后,第A~B行一共有多少个红气球?例如,k=3,A=3,B=7,答案为14。 需要设出如下变量: g(k, i): k 小时后最下面 i 行的红气球总数 c(k): k 小时后红气球的总数原创 2017-08-03 20:05:05 · 235 阅读 · 0 评论 -
UVA - 12558 Egyptian Fractions (HARD version) : 埃及分数问题 IDA*
题目点此跳转 Given a fraction a/b, write it as a sum of different Egyptian fraction. For example, 2/3 = 1/2 + 1/6. There is one restriction though: there are k restricted integers that should not be used a原创 2017-07-24 19:42:21 · 640 阅读 · 0 评论 -
UVA - 1601 The Morning after Halloween : 状态空间搜索 坐标编号 双射 16进制编码
题目点此跳转 You are working for an amusement park as an operator of an obakeyashiki, or a haunted house, in which guests walk through narrow and dark corridors. The house is proud of their lively ghost原创 2017-07-24 14:20:36 · 523 阅读 · 0 评论 -
UVA - 11572 Unique Snowflakes(唯一的雪花) : 滑动窗口
题目点此跳转思路 题目意思是输入一个长度为n(n≤106)的序列A,找到一个尽量长的连续子序列AL~ARA_L~A_R ,使得该序列中没有相同的元素。 首先定义L和R表示要找的结果的左右端点,一开始L = R = 0; 然后我们不断地增加R,直到不能增加了为止,不能增加是因为再增加的话就有相同的元素了; 这个时候我们维护一下最大值,然后开始增加L,直到将那个使R不能再增加的元素去掉为止;原创 2017-08-01 17:33:57 · 495 阅读 · 0 评论 -
UVA - 1606 Amphiphilic Carbon Molecules : 极角扫描法 利用叉积比较极角大小
http://www.cnblogs.com/zyb993963526/p/6353892.html?utm_source=itdadao&utm_medium=referral#include <algorithm>#include <iostream>#include <sstream>#include <utility>#include <string>#include <vecto原创 2017-07-31 16:27:09 · 410 阅读 · 0 评论 -
算典05_例题_08_UVA-400
Unix ls 题意输入正整数n以及n个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M字符,则最右列有M字符,其他列都是M+2字符。题解只要算出行数和列数即可#include <algorithm>#include <iostream>#include <sstream>#include <string>#include <vector>#include <queue>#in原创 2017-04-02 21:30:16 · 423 阅读 · 0 评论 -
算典05_例题_06_UVA-540
Team Queue 题意有t个团队正在排一个长队,每次新来一个人,如果他有队友在排队,他就会插到最后一个队友的后面,否则他就会排到队尾 对于每个出队操作,输出出队的队员编号题解STL水题。练习使用队列queue 这里用两个队列,一个记录每个队的排队情况,一个记录长队中排队的团队编号#include <algorithm>#include <iostream>#include <sstrea原创 2017-04-02 18:00:44 · 371 阅读 · 0 评论 -
算典05_例题_05_UVA-12096
The SetStack Computer题意有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且支持以下操作: PUSH:空集“{}”入栈 DUP:把当前栈顶元素复制一份后再入栈 UNION:出栈两个集合,然后把两者的并集入栈 INTERSECT:出栈两个集合,然后把二者的交集入栈 ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,原创 2017-04-02 16:48:59 · 368 阅读 · 0 评论 -
算典03_习题_05_Uva-227
Puzzle滑动拼图游戏 本题不好ac的地方就是输入问题 用gets()输入每一行还好说,主要是后面输入命令的时候,如果 我边输入边判断的话,会出现一种情况是: 当我判断到不合法时,就直接break了,那么它后面的许多字符就会留在输入流,而且可能不止一行,这个时候如果我在下一个数据里用gets()时就会读取到错误的数据 明白这一点基本上就能ac了,只要当判断不合法时不break,直到判断到最原创 2017-02-14 17:12:35 · 498 阅读 · 1 评论 -
算典03_习题_11_UVA-1588
Kickdown 题意给出两个长度分别为n 1 ,n 2 (n 1 ,n 2 ≤100)且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器(如图3-8所示),问能够容纳它们的最短容器长度。题解模拟 分别固定其中一个,一步一步移动另一个,并找出结果的最小值#include <iostream>#include <cstdio>#include <algorithm>#include原创 2017-02-18 21:35:18 · 432 阅读 · 0 评论 -
算典03_例题_01_Uva-272
给一段文字,碰到左双引号"就变为 ` ` , 碰到右双引号"就变为' '(即两个单引号) 这里使用getchar 获得每个字符,然后判断即可原创 2017-02-13 09:39:22 · 382 阅读 · 0 评论