算法竞赛入门经典
NingLiu_
该csdn博客专门用来做技术类的总结,希望自己能给初学者一些鄙陋的建议和帮助
展开
-
UVA - 673 Parentheses Balance
/* 本来读完题目以后的第一反应是,看上去挺简单的,直接先注释一下 "//水题" 不久就打脸了,我发现我错的有多离谱了... 先是太不仔细,没有考虑桟空的情况,存在桟空时仍 pop() 的情况,导致程序崩掉 后来又WA,发现我有细节没有考虑到,就是输入代表组数的数字以后,应该要用 getchar()吃掉一个回车 想着这样改完应该没问题了吧?结果还是WA...于是开始原创 2017-10-07 22:14:43 · 197 阅读 · 0 评论 -
UVA - 514 Rails
#include #include using namespace std;const int N = 1000 + 10;int n, target[N];//target数组用来记录,题目所要求的,进入B方向的n个火车的依次序号 int main(){ while (cin >> n && n) { stack s; while (cin >> target[1]原创 2017-09-23 23:58:20 · 158 阅读 · 0 评论 -
UVA - 679 Dropping Balls
/* 该题如果用模拟数组,运算量很大,复杂度极高,必须想办法改进 可以发现,小球落入叶子结点的路线,其实和小球标号(准确说,是小球标号的奇偶性,有关),可通过找规律,极大减小程序运算量 思路在白书P140-150写的很清楚,手边没书可以看这个博客 http://blog.csdn.net/qq_24489717/article/details/49514869 也写得很清原创 2017-09-23 23:59:22 · 173 阅读 · 0 评论 -
UVA - 1572 Self-Assembly
/* 这题查了很多题解和资料,磕磕碰碰,画图和举各种例子,才终于想明白了... 虽然代码确实很短,但是也确实很难想啊...根本没有想到,能把它和拓扑排序联系起来... 以及,分别用 2n 和 2n+1,表示 A+ 和 A- 等这样的一对一对,也是很棒的处理方式啊!~ 而且,用亦或来实现,将一条边,转换为与它拼接的边,十分精妙啊! 我记得之前学古文时,有听原创 2017-10-06 18:16:54 · 213 阅读 · 0 评论 -
UVA - 11853 Paintball
/* 这题的思路让我觉得很巧妙,所以...虽然小白书 P175 ,已经有详细到能看懂的解释了,但我还是用自己的话,把书上的解析复述一遍: 简化: 先判断解的存在性,有解再找解 类比: 可将敌人类比为圆,攻击范围则为一个个以敌人位置为圆心,攻击距离为半径的圆 可将战场看成湖,敌人的攻击范围组成的圆,看作一个个圆形踏脚石,看能否从湖的上边界走到下边界原创 2017-10-07 17:11:21 · 330 阅读 · 0 评论 -
UVA - 506 System Dependencies
/* 分析可见小白书 P174,我的代码中也有部分的分析和解释 收获: 1. vector中,remove 和 erase 联合,用来删除指定的元素 某个blog上有言简意赅的一个用法的举例说明 ( 来自: http://www.cnblogs.com/warmbeast/p/5325874.html): vector v; v.erase(r原创 2017-10-07 14:07:58 · 200 阅读 · 0 评论 -
UVA - 1599 Ideal Path
/* 总体思路见小白书 P173 的讲解,不过小白书非常言简意赅,有点不好理解,所以我把自己的一些理解,加到了代码注释里 收获: 1. C++ 中,bool 类型的 true 等价于 int 类型的 1, bool 类型的 false 等价于 int 类型的 0 参见 ( https://stackoverflow.com/questions/5369770/bool-to-原创 2017-10-07 09:09:17 · 265 阅读 · 0 评论 -
UVA - 10763 Foreign Exchange
//这题虽然不算难题,而且因为还没学图论,不知道无向图是什么,所以查题解磕磕碰碰地完成了,过程可谓是一波三折,不过也算收获良多/* 法一: 参考blog1: http://blog.csdn.net/shihongliang1993/article/details/73500018 这个博主用了许多C++11的新特性,看得我大开眼界,将他用到的几种新用法弄明白,都用了不少的原创 2017-09-03 14:17:20 · 249 阅读 · 0 评论 -
UVA - 10935 Throwing cards away I
/* 这题用到了队列的思想 BTW,查题解时,看到两个大佬的代码真是简洁,于是果断抛弃了自己写的,用他们的思路重新做了一遍 参考博客: http://www.cnblogs.com/AlgoWing/archive/2013/03/04/3189616.html http://blog.csdn.net/mobius_strip/article/details/45原创 2017-09-02 17:00:44 · 188 阅读 · 0 评论 -
UVA - 1594 Ducci Sequence
/* 做这题时的心路历程其实挺有趣的 一开始看到说Ducci序列最终要么全0,要么循环,我在想: 要怎么判断循环呢?是不是还得记录下循环节什么的?是该用数组记录循环节吗?还是想要让我们利用STL来记录? 后来又读了一次题,发现自己真是跑偏了,既然说全0或者循环,只要不是全0,最终就一定是循环嘛...我究竟是在纠结些什么 T^T 判断全0可不是比判断循环容易多了么?原创 2017-09-02 15:36:46 · 347 阅读 · 0 评论 -
UVA - 1593 Alignment of Code
/* 这题的收获 or 技巧 or 注意点 or 说明 1. getline函数读取整行 2. 流输入stringstream 3. string的size函数、length函数的返回类型都是size_type类型,在使用返回值之前,务必先进行强制类型转换 4. 此题有个坑点,每行的最后一列的单词,后面是没有空行的,直接回车,因此,要将最后一列的输出单独拿出来原创 2017-09-02 14:45:34 · 192 阅读 · 0 评论 -
UVA - 1585 Score
//得分 uva1585//这题好像没什么特别的收获,标准水题#include #include using namespace std;int main(){ int m; cin >> m; char s[100]; while (m--) { cin >> s; int n = strlen(s), t = 0, sum = 0; for (int i原创 2017-09-02 11:21:38 · 205 阅读 · 0 评论 -
UVA - 816 Abbott's Revenge
/* 这题和普通的迷宫题有类似之处,比较有趣的地方是,加了方向,所以处理时会麻烦一些,既要记录方向,还要记录父节点 收获 && 总结: 1. 复习了 strchr 函数 (作用:在C风格的字符串中,找到指定字符在串中的所在位置,要配合数组名使用,减去数组名才能得到所在位置的下标) http://blog.csdn.net/zhulihuo/article/details/18原创 2017-10-05 23:23:03 · 192 阅读 · 0 评论 -
UVA - 10305 Ordering Tasks
/* 初次接触拓扑排序,查找并看过的资料链接,罗列一下: http://www.cnblogs.com/luruiyuan/p/5509523.html 这题有一个很容易WA的点: 本题应该是 m、n同时为0时,才结束输入的循环;而不是我们通常认为的,只要有一个0就结束循环了...这个问题很容易WA */#include #include #inc原创 2017-10-06 09:07:06 · 198 阅读 · 0 评论 -
UVA - 536 Tree Recovery
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=477题意:给出二叉树的先序和中序遍历序列,输出后序遍历序列查阅了的题解:http://blog.csdn.net/mobius_strip/articl原创 2017-10-28 09:37:29 · 169 阅读 · 0 评论 -
UVA - 1103 Ancient Messages
/* 收获: 1. 概念理解 图形的拓扑等价 可见: http://www.baike.com/wiki/%E6%8B%93%E6%89%91 摘取重点: 在拓扑学里不讨论两个图形全等的概念,但是讨论拓扑等价的概念。比如,尽管圆和方形、三角形的形状、大小不同,在拓扑变换下,它们都是等价图形。在一个球面上任选一些点用不相交的线把它们连接起来,这样球面就被这些线分成许多块。在原创 2017-10-05 18:42:20 · 224 阅读 · 0 评论 -
UVA - 712 S-Trees
/* 这题初看时容易被吓到,甚至连题目的意思都有些一知半解,但是沉下心仔细看几遍,就能发现也不是那么难,肯定不是难到完全想不出那种 这题主要就是在考察完全二叉树 收获: 1. C 语言的格式控制非常好用,可以把一个已知位数的整数,其位数一步步分离出来,链接见 https://zhidao.baidu.com/question/493600982.ht原创 2017-10-25 16:45:51 · 212 阅读 · 0 评论 -
UVA - 127 Accordian Patience
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=63这题也是比较考思维,好像没什么特别的技巧和知识点,但是自己想的时候,怎么也想不到用 vector > 处理的这种方式...可能STL学的还不够熟练吧...参考了别人的题解和思原创 2017-11-01 15:34:46 · 236 阅读 · 0 评论 -
UVA - 806 Spatial Structures
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=747白书对此题的评价:本题有一定实际意义,而且需要注意细节,建议读者一试----------------------------------------------------原创 2017-10-31 11:13:46 · 231 阅读 · 0 评论 -
UVA - 804 Petri Net Simulation
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=745小白书上的说明:本题有一定实际意义,理解题意后编码并不复杂,建议读者一试(然而这题,就是题目不太好完全理解,我最初先看了几次题目,又对照着别人题解上的代码,再看了几次题目,才差原创 2017-10-29 22:40:12 · 396 阅读 · 0 评论 -
UVA - 12166 Equilibrium Mobile
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3318要点:我觉得,这题主要是考察思维,而不是考察技巧当然,还是有一点点技巧的,就是不用这个就会有些麻烦,比如map 的巧妙应用,就算是一个技巧其实这题原创 2017-10-28 21:47:54 · 199 阅读 · 0 评论 -
UVA - 160 Patrol Robot
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4475知识点:带状态的 bfs通过增加数组维度来实现*/#include #include #include #define rep(i, n原创 2017-10-28 16:37:11 · 205 阅读 · 0 评论 -
UVA - 439 Knight Moves
/*题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=380知识点:bfsdfs查阅资料汇总:http://blog.csdn.net/ns_code/article/details/19617187原创 2017-10-28 14:29:38 · 209 阅读 · 0 评论 -
UVA - 12171 Sculpture
/* A. 这题用到了之前做过的一些题的一些思想: 例如: 1. 之前做过的 UVA - 1103 Ancient Messages ( http://blog.csdn.net/mofushaohua_ln/article/details/78162277 ) 两题十分相似之处在于,都是连通块问题,且都要在最外围,加上一圈“空气”,以使得所有空气格子得以连通原创 2017-10-06 15:54:41 · 335 阅读 · 0 评论 -
UVA - 10562 Undraw the Trees
/* 直接在二维字符数组中递归,无须建树 注意对空树的处理,以及,结点标号可以是任意可打印字符 其他链接: 1. http://www.cnblogs.com/Bob-tong/p/6610647.html isspace()函数的功能为:判断输入字符是否为空格/回车/制表符等 (而不仅仅只是判断空格) 2. http://blog.csdn.net/daiyu原创 2017-10-06 11:09:39 · 192 阅读 · 0 评论 -
UVA - 10129 Play on Words
/* 把字母看作结点,单词看成有向边,则,问题有解,当且仅当图中有欧拉路径 存在欧拉道路的条件,见小白书 P169 判断连通的方法有两种: 1. DFS 2. 并查集*/#include #include #include #include using namespace std;const int N = 256;int used[N]; /原创 2017-10-06 10:25:40 · 224 阅读 · 0 评论 -
UVA - 272 TEX Quotes
//入门经典P47 水题#include int main(){ int c, q = 1; while ((c = getchar()) != EOF) { if (c == '"') { printf("%s", q?"``":"''"); q = 1 - q; } else printf("%c", c); } return 0;}/*原创 2017-09-02 11:21:04 · 180 阅读 · 0 评论 -
UVA - 136 Ugly Numbers
/* 思路: 从小到大生成所有的丑数,最小的丑数为1,对于任意丑数x,2x,3x,5x也是丑数; 这样就可以用一个(数值越小,优先级越大的)优先队列来保存所有已生成的丑数,每次取出最小的丑数,生成3个新的丑数入队(生成的3个中,并不一定都是新的丑数,但只让新的入队),直到取出的丑数是第1500个丑数 但要注意: 同一个丑数可能有多种生成方式,例如(10 == 2 * 5原创 2017-09-02 11:16:05 · 173 阅读 · 0 评论 -
UVA - 814 The Letter Carrier's Rounds
/* 用到的处理手法 or 收获 or 注意事项: 1. substr函数分离邮箱的用户名和MTA,当需要有两个返回值时,通过传两个引用并改变它们来实现 2.对于map,在使用map[key]前,必须先检查一下key是否存在 如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可原创 2017-09-02 11:14:47 · 266 阅读 · 0 评论 -
UVA - 839 Not so Mobile
/* 此题代码看似极其简短,但要理解,还是需要想比较久,考虑清楚代码的真正含义。 值得重做,对于递归的理解很有帮助! 该题最重要的部分是,递归输入;并且运用引用,使得在输入时,便可完成平衡的判断 这题的引用的使用是否巧妙,值得好好体会,时不时重看!*/#include using namespace std;//输入一个子天平,返回天平是否平衡原创 2017-09-23 23:56:26 · 168 阅读 · 0 评论 -
UVA - 572 Oil Deposits
/* 1. 图也有DFS遍历和BFS遍历,前者用递归实现,后者用队列实现。由于DFS更容易编写,一般用DFS求连通块。求多维数组连通块的过程也称为种子填充 2. 一般要尽量避免同一个格子被访问了两次,但是在这道题中,即便访问两次,也不会影响最终结果,所以横纵坐标变化量,取不取 0 0 这组数据,都没有关系 3. 对于某一@点,遍历其上下左右对角线时,可以写8个dfs递归,表原创 2017-09-23 23:55:29 · 170 阅读 · 0 评论 -
UVA - 297 Quadtrees
/* 代码虽然极其简短,但看懂也是不易,我觉得自己就思考了挺久,才彻底弄懂。所以做好心理准备,不要因为它似乎简短就轻视它,多多揣摩一下!~ 四分树比较特殊,只需给出先序遍历就能确定整棵树(因为每棵树的每个子节点,都会分出4个节点,也即4个字母,除非递归走到叶子节点。当然,还除非都是同色,那该子树就只用1个字母表示了) 所以只需要编写一个"画出来的"过程,边画边统计即可*/原创 2017-09-23 23:54:38 · 230 阅读 · 0 评论 -
UVA - 548 Tree
//本质是树的深度优先遍历#include #include #include #include #include using namespace std;const int INF = 1e9;//因为各个结点的权值各不相同,且都是正数,直接用权值作为结点编号const int maxv = 1e4 + 10;int in_order[maxv], post_order[原创 2017-09-23 23:54:01 · 186 阅读 · 0 评论 -
UVA - 122 Trees on the level
/* 收获(详细内容见入门经典P151-155) 1. 本题用于出入输入数据的函数 read_input 的书写方法,很值得学习 2. 关于sscanf函数: http://www.cnblogs.com/kex1n/archive/2011/06/09/2076501.html 3. C语言中字符串的灵活性: 可以把任意“指向字符的指针” 看作字符串,从原创 2017-09-23 23:53:18 · 207 阅读 · 0 评论 -
UVA - 12657 Boxes in a Line
/* 小白书上给出了代码,但是对于代码的解释,不是特别详细,这个博客就比较详细,基本写出了几种分类的依据和考虑,以及如何对于哪些情况,要特别拿出来特判 博客: http://blog.csdn.net/acmore_xiong/article/details/47753589 注意: 1. 虽然小白书上定义的数组名是 left 和 right ,但是不太建议用这两个,因原创 2017-09-23 23:51:11 · 197 阅读 · 0 评论 -
UVA - 11988 Broken Keyboard (a.k.a. Beiju Text)
/* 1. Home键的作用是将光标定位到文首,End键的作用是将光标定位到文尾 2. 在数组中频繁移动(尤其插入和删除)元素比较低效,如果可能尽量使用链表 3. 虽然一般讲链表会讲到指针,但链表实现方式,并非一定需要指针,例如此题*//* ------------------心路历程分割线,可以直接跳过------------------ 还是第一次接触这原创 2017-09-23 19:47:39 · 201 阅读 · 0 评论 -
UVA - 210 Concurrency Simulator
/* 本题借鉴了LRJ在github上放的入门经典的代码库 收获 && 总结: 1. 双端队列deque 下面这个博客总结的比较细致 2. fgets函数 http://www.cnblogs.com/aexin/p/3908003.html 3. 该题最好不要用C++的getline,也不要用string,最好还是用字符串数组 char[][],因为原创 2017-09-23 19:44:58 · 255 阅读 · 0 评论 -
UVA - 230 Borrowers
/*法一: 参考博客: http://blog.csdn.net/shihongliang1993/article/details/73559187 此外,这个blog也是用集合做的,所不同的是,这个博客没用string类型的pair,而是用了两个pair元素组成的结构体: 以及,下面这个blog的解法虽也为集合,本质上一样,但是没用到C++11的那么多特性,所以更容易理解原创 2017-09-07 07:45:08 · 177 阅读 · 0 评论 -
UVA - 12100 Printer Queue
/* 法一: 这题最开始时,想到可能需要用优先队列...可是还是懵懵懂懂,不知道怎么下手,后来看到了法一的思路,发现博主就只是用到普通队列,思路如下: 任务依次入队,压入的数为其优先级 进入最外层 while(1)循环,该循环直到所关注的任务刚好位于队首,且打印结束后,退出while(1)循环 每次取出队列中第一个元素,若: 1. 如果队列中有优先级比队首更大原创 2017-09-06 11:41:18 · 210 阅读 · 0 评论 -
UVA - 1595 Symmetry
/* 可用暴力破解的方法,思路如下: 先假设对称轴存在,且其为 x = xmid,那么对称轴肯定为为左端和最右端中点的平均数 xmid = ( xmin + xmax) / 2 如果x = x0真为对称轴,对任意的 xi,都会有 xj = 2 * xmid - xi; 鉴于求xmid涉及除以2,但是判断的时候,却可以用对称轴横坐标的两倍来判断,出于精度和误差方面的考原创 2017-09-04 00:00:14 · 182 阅读 · 0 评论