OJ
文章平均质量分 58
_星尘_
这个作者很懒,什么都没留下…
展开
-
Uva 810 DFS+骰子模拟
原题很有意思的一道题, 因为是根据骰子的点数走迷宫, 自然就只能一步步模拟了.最大的难题在于怎样确定骰子旋转后的情况. 由于骰子旋转之后每个面点数的变化规律比较难找, 但由于骰子有六个面,而且每个面的对立面都是固定的, 因此只要知道其中两个位置的点数就可以推断出整个骰子的点数了。因此可以采用枚举法, 也就是可以用一个二维数组, 枚举存放固定两个面(如front和top)之后剩下的第三个面(如righ原创 2015-11-28 08:47:34 · 664 阅读 · 0 评论 -
uva 400
原题简单题, 文字排版, 每行找到最长的单词, 用60+2再除以最长单词的长度+2取floor(默认的)即可得到column,再用总单词数除以column取ceil得到row输出单词, 每个单词输出完补齐空格即可一开始的输出和题目的样例输出差了几个空格, 以后OJ会检测到, 没想到提交上去直接AC了, 看来OJ不是对每道题的输出格式都严格要求的#include #原创 2015-09-18 13:53:32 · 369 阅读 · 0 评论 -
uva 221
方法非常经典的题, 这道是建筑物遮挡, 类似于任务安排类的问题坐标是实数, 有无穷多个无法枚举的, 就采用将其离散化的思路具体方法:把所有建筑的横坐标(包括起和止两点)存入一个横坐标序列, 排序,排好后的序列中每两个相邻坐标视为一个区间,以区间为单位进行分析(这就是离散化的方法).这样一来,每次只分析那些经过该区间的建筑物(可以取区间中点来判断某个建筑是否在该区间内原创 2015-09-19 20:58:52 · 313 阅读 · 0 评论 -
uva 10562
原题一道蛮有意思的字符串处理题建树什么的还是用递归比较方便题目描述和思路也都比较清晰, 就不再赘述了#include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2015-10-06 19:21:51 · 424 阅读 · 0 评论 -
uva 10129
原题欧拉路径经典问题, 给一些字符串, 要求验证字符串之间是否存在欧拉路径题意能化简就化简, 其实字符串只看首尾字母即可, 各代表一个顶点, 一个字符串就是一条边然后就是欧拉路径的通解法, 对于无向图只需要验证连通性, 并且奇数度的顶点只能有2个(一个起点一个终点形成欧拉路径) 或 0个(形成欧拉回路)对于本题中的有向图, 除了连通性, 除了起点和终点之外, 各个顶点的出度原创 2015-10-06 14:49:00 · 449 阅读 · 0 评论 -
uva 10305
原题经典的拓扑排序, 每次找入度为0的点, 输出, 并且把与这个点相连的点的入度-1依次循环就行了因为我这里是每输出完一次就对原数组排序, 所以注意要把输出完毕的点入度设为一个较高的值#include #include #include #include #include #include #include #include #include #inc原创 2015-10-06 14:28:41 · 287 阅读 · 0 评论 -
uva 12096
点击打开链接说实话 这是一道让我十分费解的题, 最大的问题在于不知道用什么样的数据结构或容器来存储这些set, 最后实在想不通了, 只能上网找例程来看... 一开始居然还看不懂, 到后来才逐渐理解起来就是可以用map来把各种各样的set各自一一映射到一个数值, 相当于用数值来编码各种形态的set这样就充分利用了map的优点, 正如其名——映射比如从某个数字开始, 为set原创 2015-09-16 20:42:44 · 288 阅读 · 0 评论 -
uva 540
还是比较简单的, 模拟某种队列, 用STL做非常方便主要就是用一个map来记录每个元素所属的队列, 之后要pop就一个个队列输出就行了#include #include #include #include #include #include #include #include #include #include #include #include using n原创 2015-09-17 00:39:13 · 258 阅读 · 0 评论 -
uva 156
原题简单题, 也是用来练习STL的但是其中的思想, 方法十分巧妙, 相比普通的solution要快很多STL是C++的一个优点, 要学会巧妙地, 多样地使用STL#include #include #include #include #include #include #include #include #include #include #include原创 2015-09-15 22:21:00 · 289 阅读 · 0 评论 -
uva 101
原题一道比较繁琐的模拟题, 非常能练习STL的一开始WA了好多次, 原因是看漏了题目描述最后一句话, 对于不合法的命令要自己进行忽略处理.....以后看题得耐心, 看完才下手#include #include #include #include #include #include #include #include #include #include us原创 2015-09-15 20:17:15 · 265 阅读 · 0 评论 -
uva 10815
原题本来应该是一道非常基础非常normal的题目结果还遇到了两个坎, 不过也有所收获了第一个是迭代器的失效问题.序列性容器(vector, string, list等) 使用erase(iterator)之后, 不仅使所有指向被删元素的迭代器失效, 而且使被删元素之后的所有迭代器失效(因为它们都是顺序存储的), 所以不能使用erase(iter++)的方式. 正确方法:1)原创 2015-09-15 21:14:20 · 317 阅读 · 0 评论 -
uva 816
原题在开始刷题这一个月里, 迄今为止耗时最久的一题!题目虽然很长, 但是题意不难理解, 这个迷宫是一个定向迷宫, 每一点都有自己的规则走每一步都要受到这个点的规则限制来选择下一点, 就这样, 给出起点和终点, 要找到一条从起点到达终点的路径一开始没看到要找尽量短的路, 就直接用DFS写, 那叫一个easy然而WA了3次, 是不是看漏条件了, 于是回头看题目, 才看到原创 2015-10-02 19:21:10 · 361 阅读 · 0 评论 -
uva 297
原题有点烦的一题, 也是计算节点的值, 但是有两棵树, 取两棵树的并集, 也就是两棵树同一个节点的值要尽量取大的方法很多, 基本上也都是需要给每个结点存一个值, 这个值等于其四个子节点的值之和, 以此类推这次试了一个以前没用过的方法, 因为子节点的数目是固定的, 所以想给每个结点赋一个ID, 然后用map记录结点的值子节点从左到右标上序号1,2,3,4, ID就是从根节点(10原创 2015-10-01 20:34:10 · 309 阅读 · 0 评论 -
uva 839
原题简单题, 用杠杆原理判断是否平衡没有经验, 一开始就构造了一个struct, 但是AC之后去翻了别人的代码, 发现没啥必要因为这些数据判断完一次就没用了, 干嘛要存起来呢还有就是又被这个坑给坑到了....两个case之间需要空行 , 意味着最后一个case输出完后不需要空行牢记!!!! #include #include #include #include原创 2015-10-01 08:40:59 · 264 阅读 · 0 评论 -
uva 1594
原题没什么技巧性的一题, 主要是用map给每一个状态的N元组记录一下, 然后transform,如果transfrorm之后的被记录过了, 说明回到了原来的状态, LOOP,如果某次transform之后全为0了也结束循环#include #include #include #include #include #include #include #include原创 2015-09-20 13:18:02 · 301 阅读 · 0 评论 -
uva 10763
原题简单题, 主要还是自定义一个类型装两个坐标(因为没法创建那么大的二维数组)然后用map映射自定义类型来记录是否有出现过,再有就是用一个count计数器, 出现新的坐标就+1, 匹配一对就-1, 以此来最后判断是否全部匹配了#include #include #include #include #include #include #include #include原创 2015-09-20 20:52:53 · 286 阅读 · 0 评论 -
uva 12100
原题简单题, 纯粹的按题意队列模拟有时候用一点struct可以使得代码更清晰, 况且struct也不太会拖慢速度#include #include #include #include #include #include #include #include #include #include #include #include #i原创 2015-09-21 21:25:33 · 406 阅读 · 0 评论 -
Uva 10410 层序+前序构造树
原题非常经典也比较有意思的一题, 由树的层序遍历和前序遍历构造树. 但是我们都知道, 没有中序的话构造出来的树的可能情况是很多的, 因此题目加了一个很关键的限制条件, 就是遍历序列都是先从点数小的子节点开始访问的. 一开始没注意到这个关键, 空想了很久也没想出来比较好的方法.其实思路和其他同类的问题(根据两个遍历序列构造树)的思路完全一样, 都是以一个序列为标准, 对另一个序列不断分解成几段原创 2015-11-27 13:23:24 · 654 阅读 · 0 评论 -
Uva 127 模拟+细节
原题简单题, 模拟叠纸牌, 规则是一开始有52堆牌, 每一堆有1张, 如果某一堆牌的最顶上的一张牌与它左边第一张牌(指的是左边第一堆上的最顶上一张牌, 下同)或左边第三张牌的花色或点数相同则可以把这张牌往那张牌上叠, 以此类推,直到所有的牌都无法移动为止。 如果某一堆上没有牌了,就这个堆的位置删除(也就是后面的堆都可以往左移动)。注意到几个细节:每次只能操作某一堆牌的最顶上那张;如果有若干张可以移原创 2015-11-26 15:49:49 · 550 阅读 · 0 评论 -
5-30 Table Tennis (30分)
原题一看就是模拟题, 但就是有些细节有点繁琐.. 题意大概是维护一些桌子, 有人来的时候如果有桌子就分配,没有桌子就让他们等待下一张空闲的桌子。只不过还有一些特殊的VIP桌子和VIP用户,如果当前有空闲的VIP桌子,那就优先分配给已经到达的且当前正在等待队列中的那些VIP用户。若没有空闲的VIP桌子则VIP用户视为普通用户处理。我的主要思路就是按时间点(currentTime)推进的顺序来逐一处理原创 2015-11-25 00:00:26 · 435 阅读 · 0 评论 -
uva 1599
原题 最近课业比较繁忙, 好久没时间写题了。 这也算是最短路径问题的改版,求满足一个条件的最短路径。 经验不足,一开始自然就想到用DFS(因为比较好写),结果当然TLE了 后来才想起来DFS的复杂度是O(N^2), 而BFS是O(N+E), 所以遇到这种规模比较大的图肯定要用BFS了, 根本不是一个数量级啊 网上虽然方法比较多, 但是描述得不是很全面, 我再来整理一下吧 主要思路是用原创 2015-10-31 10:45:54 · 960 阅读 · 1 评论 -
uva 804 Petri Net 模拟
原题普通的模拟题, 题目虽然比较长但流程还是比较简单的, 所以主要还是几个细节的问题处理好就行了。注意如果所给数据只能进行N轮循环, 而要求的循环数NF正好等于N时,执行完N轮退出时的状态仍然是alive,虽然下一步已经没有操作可做了。奇怪的是一开始不知道为啥超时了,然后似乎没改进什么复杂度只改了几个细节再交上去就AC了。。。以下为AC代码:#include <iostream>#include原创 2015-11-15 15:11:15 · 527 阅读 · 0 评论 -
Uva 12166 严格平衡树
原题一开始想得太简单, 直接读数据建立树, 然后像堆调整那样一个个结点检查并向上调整子节点的重量, 后来写到一半发现这样不可行, 需要处理的情况太多, 这样模拟的过程太繁琐了.. 于是可耻地google了答案——原来这棵树每层的结点值都是满足一定规律的,在同一层上的结点值必须相等, 而且上层的值是下一层的节点值的两倍。认识到这个规律后,还是需要做一点巧妙的处理(方法来自这里 ) :由于只要选择一原创 2015-11-14 17:24:14 · 483 阅读 · 0 评论 -
Uva 1600 满足条件的最短路
原题非常有意思的一道最短路径题. 地图中有障碍物, 障碍物可以通过, 但不能连续通过K个障碍物. 实现起来也不难, 就是在BFS的时候给结点添加一个属性来记录已连续通过的障碍物个数就行了.比较值得注意的地方是, 如果用map存储自定义类型, 而且自定义类型中的还有多个同等重要的成员时, 重载<运算符的时候必须小心一些, 应该类似这样的形式:friend bool operator<(const Po原创 2015-11-14 14:01:30 · 314 阅读 · 0 评论 -
Uva 439 象棋最短路
原题经典的最短路问题, 只不过可以走到的结点需要满足象棋中Knight的走法, 类似于中国象棋中马的走法, 只不过不用考虑拐角的限制。 还是比较简单的, 普通的BFS做一下即可还是不得不说 - STL大法好 :)#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#原创 2015-11-14 11:02:48 · 327 阅读 · 0 评论 -
Uva 673 括号匹配
原题 经典的括号匹配问题, 这种问题一律用堆栈, 也非常好写 唯一需要注意的地方是以行为单位区分字符串的, 因此要每次读入一行 然后再消去其中可能出现的空格. 用algorithm的remove_if和string自带的erase一步到位~#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#原创 2015-11-13 20:21:27 · 302 阅读 · 0 评论 -
Uva 536 前序中序序列构建树
原题由中序遍历和前序遍历序列求树的后序 题目虽然简单但是确实比较经典, 所以还是记录一下吧 这次尝试一下用map容器存储树 这样既能表面上实现树的顺序存储, 又不会浪费太多空间 :)#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algo原创 2015-11-14 10:21:32 · 302 阅读 · 0 评论 -
Uva 712 树计算布尔函数
原题简单题, 就是用一棵树来表示一个布尔函数然后对一些输入的变量求函数值 题目已经把意思和解题思路都描述清楚了, 直接模拟即可 最后又被空行坑了一次 - -||#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#incl原创 2015-11-14 09:47:40 · 360 阅读 · 0 评论 -
uva 1595
原题经典的题, 验证点集的轴对称性方法就是, 将所有点记录,枚举每个点的对称点看是否存在,不存在则NO#include #include #include #include #include #include #include #include #include #include #include #include #include #inclu原创 2015-09-21 23:57:50 · 326 阅读 · 0 评论 -
UVA 11853(找连通块)
求连通块问题, 按照紫书上的思路, 构图(每一块受攻击区域作为一个结点)进行DFS, 若有一条路(攻击区域内)能够连通上下边则输出IMPOSSIBLE, 否则就分别计算最靠北(坐标值较大)的出入点.整个区域是一个大的正方形. 求连通块比较简单, 从那些与区域上边相交的结点出发进行DFS, 若能够到达某一个与区域的下边相交的结点则说明上下边可以连通.我觉得比较难的地方反倒在于找坐标值最大的出入点。比如原创 2015-11-12 21:44:34 · 598 阅读 · 0 评论 -
uva 230
原题也是纯模拟题, 远没有上次高尔夫球赛问题复杂..就构造一个Book结构, 把涉及的变量都加进去, 除了title, author还有一个state注意有三种state, (一开始以为borrow指令是无意义的, 其实还是有影响的, 借出去的书遍历的时候需要直接跳过了)#include #include #include #include #include #inc原创 2015-09-22 08:48:45 · 506 阅读 · 0 评论 -
uva 815
原题比较简单的一道题, 紫书上说比较考验思维的...#include #include #include #include #include #include #include #include #include #include #include using namespace std;const int MAXN = 100 + 10;typedef l原创 2015-09-15 16:50:19 · 307 阅读 · 0 评论 -
uva 10474
简单题.. 权当打打字#include #include #include #include #include #include #include #include #include #include using namespace std;const int MAXN = 10 + 5;const int SLEEP = 0;const int AWAKE = 1原创 2015-09-15 18:42:44 · 258 阅读 · 0 评论 -
uva 699
原题简单题, 又是构造树而且不用存储的, 这种都不用实际地去构造一种struct,直接递归然后计算即可, 这里像是一个边界不固定的数组, 下标有负数 所以我的思路是用一个map来记录每个pos的数量, 代码还是比较清晰, 就不多说了话说用好递归真是事半功倍#include #include #include #include #include #inclu原创 2015-10-01 09:55:14 · 257 阅读 · 0 评论 -
uva 512
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;const int MAXN = 100;const int base = 100;typedef long l原创 2015-09-11 20:18:47 · 403 阅读 · 0 评论 -
uva 12657
原题本来没注意到M,N的规模, 用的STL的list, 后来发现找元素的时候实在太慢了( algorithm的find是顺序查找 )然后看了答案, 发现可以用两个辅助数组 Left, Right来存每个元素的左右结点, 这样就不用一个个去查找出来再交换了, 这也是一种极简的实现双向链表的方法, 在比赛中往往没有时间写完一个数据结构的所有操作, STL效率又不够快时, 应该自己写一原创 2015-09-27 10:21:41 · 458 阅读 · 0 评论 -
uva 11988
原题挺有意思的一道题, 模拟输入, 用链表+迭代器操作非常方便一个一个字符地读进来, 读到 [ 就把迭代器指向表头, 读到 ] 就把迭代器指向表尾这里顺便复习一下 list 的迭代器插入规则 : 首先在iter处插入, 指的是从iter指向的元素的前面插入其次, 用迭代器插入一个字符后, 原迭代器仍然指向原来的字符(与连续存储的vector不同)即如果 iter 指向 list原创 2015-09-27 09:30:14 · 309 阅读 · 0 评论 -
HDU 3090
#include #include #include #include #include #include #include #include #include #include using namespace std;const int MAXN = 10000 + 10;const int MAXM = 1000000000 + 1000;typedef long原创 2015-09-12 15:37:57 · 268 阅读 · 0 评论 -
HDU 3363(分冰糖葫芦)
#include #include #include #include #include #include #include using namespace std;const int MAXN = 100000 + 10;int T;/*HDU 3363关键:①把串想象成一个环, 只要用一条过圆心的直线把环平分成两条链即可, 而由于它实际上是串, 因此已经被分过一次了原创 2015-09-12 15:36:15 · 669 阅读 · 0 评论 -
HDU 3368(翻转棋)
#include #include #include #include #include using namespace std;const int MAXN = 10;const int DARK = 1;const int LIGHT = 2;const int WALL = 3;int s[MAXN][MAXN];int Move[8][2] = { {-1,0}原创 2015-09-12 15:35:09 · 357 阅读 · 0 评论