解题报告
文章平均质量分 60
Yonah潇
这个作者很懒,什么都没留下…
展开
-
UVa 548 - Tree 二叉树的重建与遍历
题意:给你中序和后序的遍历顺序,建树算路径和,输出最小路径和的叶子值。思路:进行了二叉树重建之后,只要对这棵二叉树进行搜索, 取得各个路径之和,然后找出最小的那个和即可。关键就是利用遍历顺序重建二叉树,这一点我参考了D_Double的报告UVa 548 - Tree 二叉树的重建——中序遍历与后续遍历进行建树。由中序遍历 分别和前序遍历,后序遍历进行建树的方法://原创 2014-02-15 12:05:40 · 611 阅读 · 0 评论 -
UVa 442 - Matrix Chain Multiplication解题报告
利用栈模拟乘法括号运算。利用map建立键值映射可以很快的做出来。一次ac。思路:用结构存储矩阵的row,col。然后用map把矩阵代号作为键值映射到结构上。遇到不是“)”的都压栈,遇到“)”就出栈计算,再建立新的映射存储新的矩阵压栈。ps:@表示出错的地方//442 - Matrix Chain Multiplication#include #include #include原创 2014-02-12 14:47:54 · 718 阅读 · 0 评论 -
UVa 10152 ShellSort解题报告
题意:有一堆的乌龟,输出一堆乱序的乌龟,然后输入一个正确的顺序,要求找到一种最小步骤的方法使得第一堆变成第二堆,每一次可以把乌龟移到第一个位置,输出该方法步骤。思路:从后往前遍历第二个乌龟数组,与第一个乌龟数组比较。每个乌龟都有一个从小到大的编号,由第二个乌龟数组决定。于是变成了两个数字数组的顺序比较。将字符串比较抽象为数字顺序的比较。112433455原创 2014-02-11 17:20:02 · 674 阅读 · 0 评论 -
UVa 673 - Parentheses Balance解题报告
栈的经典运用,括号匹配。思路:收到“(" "["时入栈,收到”)" "]",出栈,最后判断栈是否为空//673 - Parentheses Balance#include #include #include using namespace std;char str[130];int main(){ //freopen("data.txt", "r", stdin原创 2014-02-11 20:48:15 · 711 阅读 · 0 评论 -
UVa 133 The Dole Queue解题报告
模拟队列问题,我用的是双向循环链表来模拟。 注释@的地方是我出错的地方。//133 The Dole Queue#include using namespace std;struct nobe{ int value; nobe * pre, * next;};nobe *head, *last;//记录逆时针和顺时针的起点void creat_list(int)原创 2014-02-11 13:19:04 · 640 阅读 · 0 评论 -
UVa 101 - The Blocks Problem解题报告
模拟类型的题,很麻烦。特别考验细心程度。虽然调试了很久,但是倒也学会了不少的调试技巧。注意:无需考虑将积木放回原位时原位被占的情况,因为没有任何一个操作可以把积木放在空的位置上,因此也不可能出现在第i个位置上,第i个积木的下面有其它积木的情况。思路:用一个二维数组模拟积木堆,用结构数组pos存储每个积木的x,y坐标,每个积木的代号正好与结构数组的下标形成一一映射。再用len数组存储存储每个原创 2014-02-10 20:40:42 · 802 阅读 · 0 评论 -
UVa 127 "Accordian" Patience解题报告
一道链表模拟题,可以用数组做,也可以用链表来模拟过程。用链表模拟比较麻烦,一不小心就被指针搞晕了。但是我想趁机熟悉一下链表的实现,所以用的是链表来做这道题。其实链表没有想象中可怕,就是要对指针很小心,不然很容易出现环。思路:从左到右,对每张牌堆的最上面一张牌,向其左边的第三和第一张牌做比较。优先移动到第三张牌上面。每次移动都要重新从第一张牌开始比较,直到所有牌都无法匹配。#includ原创 2014-02-10 10:10:08 · 597 阅读 · 0 评论 -
UVa 123 - Searching Quickly解题报告
题意:给出一系列要忽略的单词,这些单词以外的单词都看作关键字。然后给出一些标题,找出标题中所有的关键字,然后按这些关键字的字典序给标题排序。思路:用结构数组存储关键字和它在title中位置,最后按位置来将它大写。做这道题时,因为数组开小了一直wrong,一直以为数组开小只会runtime error,没想到居然不会越界,于是一直没有去考虑数组开小了的问题。纠结了四个小时。才发现这个问题。很原创 2014-02-04 19:37:31 · 578 阅读 · 0 评论 -
UVa 755 487--3279解题报告
第一道超时题目,数据量太大达到100000,。如果要一个一个手动模拟比较,肯定会超时。看了别人的代码,都是用到了stl的map容器。果然是神器,如果不用map还真不知道怎么在3秒内输出结果。用了map是1秒多。代码很清晰,就没写注释。#include#include#include#include#include#includeusing namespace std;c原创 2014-02-06 13:27:56 · 567 阅读 · 0 评论 -
UVa 400 - Unix ls解题报告
一道简单的字符串排序问题,只是输出格式要注意。找到规律就不难了。//400 - Unix ls#include #include #include using namespace std;int cmp_words(const void *_a, const void *_b){ char *a = (char*)_a; char *b = (char*)_b; re原创 2014-02-05 11:06:30 · 711 阅读 · 0 评论 -
UVa 10785 - The Mad Numerologist解题报告
之前用的比较多的是c的函数,最近发现c++的STL很强大,做题起来方便很多,用c的数组经常很越界,而且操作很繁琐。为了解题的方便,以后要多用STL了。可以在数据的录入和处理上省下不少时间。#include #include #include using namespace std;const char vowels[] = "AUEOI";const char conson原创 2014-02-06 17:15:40 · 597 阅读 · 0 评论 -
UVa 11234 Expressions解题报告
一道二叉树问题,套着栈和队列的外衣。说到底是利用计算表达式是利用二叉树来模拟的。如果不知道这一点,估计很难想出来。思路:栈实现的是树的后序遍历,可以根据栈的特点建树,即遇到小写字母入栈,遇到大写字母出栈,连接树的节点后再入栈。然后模拟队列实现宽度优先遍历。具体见代码。//11234 Expressions#include #include #include using namesp原创 2014-02-13 12:07:46 · 595 阅读 · 0 评论 -
UVa 11111 - Generalized Matrioshkas解题报告
一道题意很难读懂的题目,实际上是括号匹配的加强版。新增的要求是内括号的值小于外括号的值。如果一个大括号包涵几个内括号,且内括号的总和不超过大括号的值。满足条件为真,反之为假。题目很抽象,把数组当成括号可以容易理解一些。思路:用结构体表示值和空间,大括号内的小括号会占用空间,当空间小于0时说明不满足条件。这一点我想了很久,参考了别人的思路。这个条件有点难想到,最好是手动模拟一下。//1111原创 2014-02-12 19:33:31 · 658 阅读 · 0 评论 -
UVa 540 Team Queue解题报告
题意:有n只team,每只team有一些元素。然后这些元素按照队列的规律排队,如果一个元素在队伍中能够找到属于相同team的元素,则排在这些属于相同team的元素的最后方,否则作为队伍的第一个元素排在队列的最后。值得注意的是,题目输入数据都是在队伍列表中。思路:对于如此大规模的数据量,在队列中搜索队友是很耗时的。最好的办法是用映射,鉴于本题数据是数字,所以可以用一个数组建立映射,下标为元素的数原创 2014-02-13 21:10:09 · 645 阅读 · 0 评论 -
UVa 572 - Oil Deposits解题报告(图的DFS和BFS)
题意:找出相连在一起的有多少块思路:直接搜索,遇到@相连的就标记。DFS:深度优先搜索,对一个点搜索八个方向,把符合要求的点放入栈,搜完一个点后,再从栈顶弹出一个点进行同样的操作,直到栈空。入完再出。BFS:广度优先搜索,对一个点搜索八个方向,把符合要求的点放入队列,搜完一个点后,再从队首弹出一个点进行同样的操作,直到队列空。同样是入完再出。以下用DFS和BFS分别实现:(有趣的是原创 2014-02-19 11:42:34 · 720 阅读 · 0 评论 -
UVa 10562 - Undraw the Trees解题报告
题意:根据图形化的树,输出前序遍历的节点。思路:一开始我用边读边建的方法遍历,后来发现由于输入的两棵子树数据都在同一行,行不通。这道题的关键就在于处理"--------"区间决定的子树。在网上看了一下,有人想到了根据‘————“区间进行扫描,因为每一层的节点都有上面一层的”——",根节点没有,但是我们可以自己构造。这一点很巧妙,我没有想到。于是,根据上面的方法,我们用二维数组来存储整个原创 2014-02-18 16:08:16 · 725 阅读 · 0 评论 -
UVa 839 - Not so Mobile解题报告
题意:求一棵二叉树是否平衡。平衡的定义是每个树的w1*d1 == w2*d2,如果有子树,那么它的w为子树的w1+w2。思路:直接递归模拟建树过程求解。#include using namespace std;int DFS();int flag;int main(){ int cases; scanf("%d", &cases); while (cases--) {原创 2014-02-17 23:12:25 · 641 阅读 · 0 评论 -
UVa 327 - Evaluating Simple C Expressions解题报告
题意:模拟计算--,++的计算式思路:利用stl可以很简单的实现,代码也很清晰明了。首先是利用string类输入数据并清除空格,然后对式子进行扫描,以三个位单位,发现符合x++,x--,--x,++x的情况就对值进行改变,并替换。而对于字母与数字的关系,利用map映照容器建立映射,由于前置和后置对于计算是有不同影响的。使用value存储字母的最终值,用copyvalue存储计算时的字母值,分开原创 2014-02-17 18:34:31 · 779 阅读 · 0 评论 -
UVa 699 The Falling Leaves解题报告
题意:求二叉树垂直方向节点的和。思路:由于题目给出的数据是前序遍历的,最直接的方法是建树模拟。最简单的方法是用数组模拟求和。我用的是数组模拟,以根节点为中心,遇到左树-1,遇到右树+1,向两边扩展,利用建树的递归思想。#include #include using namespace std;int ans[100];void build(int, int);int main(原创 2014-02-17 11:02:47 · 1226 阅读 · 0 评论 -
UVa 712 - S-Trees解题报告
一道简单二叉树问题,但是要读懂题目意思不容易。题意:给你一棵二叉树,还有一个序列,如001,对于深度为3的树,第一个0表示在根节点处向左孩子,第二个0表示在第二层处向左孩子,1表示在第三层向右孩子。输出到达叶子节点的值。这道题跟一道小球下落的题目是一样的。思路:根据给出的n建立二叉树,模拟即可。其中对于节点的方向可以利用map建立映射。另一个思路是用数组模拟,事实上这个过程跟二分很像。原创 2014-02-16 16:32:53 · 843 阅读 · 0 评论 -
UVa 297 - Quadtrees解题报告
题意:给定两个字符串,字符p对应建立子树,字符e为白色,f为黑色对于不同层黑点f对应不同的值,最上面为1024下来为每个子树256.....,这样建立两颗四叉树,计算两颗树相加后的黑点f对应的值,注意在两颗树上同一点处,只要有一个为黑点,那么相加后就为黑点思路:首先建立两颗树,采用递归建树的方法 ,建完树后利用前序遍历的方法进行递归求解和#include #include #i原创 2014-02-16 12:32:54 · 741 阅读 · 0 评论 -
UVa 657 - The die is cast解题报告
题意:其中X和*一起称为区域I,在区域I中相连的X称为区域II , 输出就是输出m个数字,其中m就是区域I的个数,这m个数字中第i个数字num[i]表示某块区域I一面又多少个区域II。这道题就是简单图的搜索的加强版,因为需要先搜索确定区域|,再在区域|中搜索X区域。也就是双重搜索。思路:先深搜*或X,然后判断X,如果是X再调用另一个搜索函数搜索X的区域,并把搜过的地方标为*。每次调用dfs1搜原创 2014-02-27 13:29:44 · 621 阅读 · 0 评论 -
UVa 112 - Tree Summing解题报告
题意:题目要求很简单,意思是要构造一颗二叉树,然后求出所有根结点到叶结点的路径上的数字之和,如果有一个是和题目所给的一样,那么输出yes,否则no左括号‘(' 表示新建一个子结点, 优先建立左儿子,如果左儿子建立过了,则建立右儿子。 右括号表示退回父结点。如果一对括号内是空的,表示这个结点也是空的。思路:输入比较复杂, 有括号,有数字,又原创 2014-02-14 21:03:51 · 821 阅读 · 0 评论 -
UVa 10050 - Hartals解题报告
题意:一共n天,给出a1,a2...在它们的倍数日罢工,但是周六周日不罢工,输出n天中罢工的天数思路:用数组模拟。//10050 - Hartals#include #include using namespace std;bool unwork[3700];int main(){ //freopen("data.txt", "r", stdin); int cases;原创 2014-02-14 13:19:46 · 811 阅读 · 0 评论 -
UVa 10194 - Football (aka Soccer)解题报告
读入各个球队的名字, 和球队之间比赛的进球数, 要求统计各个球队的比赛总场数, 总得分等信息, 按以下优先级顺序进行输出:1. 最高得分2. 最多胜利场次3. 最多净胜球数(进球-失球)4. 最多进球数5. 最少比赛场数6. 球队名字典序, 小的排前面(比较时不区分大小写) #include #include #include #include #inclu原创 2014-02-05 21:10:33 · 569 阅读 · 0 评论 -
UVA 299 - Train Swapping解题报告
一道冒泡排序的变形。//299 - Train Swapping#include #include using namespace std;int train[60];int bubble(int *, int);int main(){ freopen("data.txt", "r", stdin); int cases; scanf("%d", &cases); whi原创 2014-02-03 14:33:51 · 579 阅读 · 0 评论 -
UVa 152 - Tree's a Crowd解题报告
题意:每一颗树都与其他的树计算距离, 取最近距离(下取整). 如果最近距离在 [0,9] 之间, 就记录下来. 最后输出各个最近距离的个数。也就是说要每个点与其他点都比较一次,求最小距离。#include #include #include #include using namespace std;struct dots{ double x, y, z;};d原创 2014-02-03 10:28:00 · 614 阅读 · 0 评论 -
UVA409 Excuses, Excuses!解题报告
一道字符串处理的题目,要求对给出的单词找到给出句子中匹配最多的句子。核心是单词的匹配,思路也很直接,把每个单词但单独提取出来匹配。题目不难,但是有挺多值得注意的编程细节。#include #include #include using namespace std;char key[21][21], excuses[21][71], cs[21][71];//cs存放转换原创 2014-01-26 16:30:34 · 638 阅读 · 0 评论 -
UVa 537 - Artificial Intelligence?解题报告
题目思路很简单,就是在一串字符中把数字提取出来转化为浮点型。关键就是字符串转数字的函数。c有自带的atof可以用,但是我用了觉得不方便,因为需要它只能针对全是数字字符的字符串,遇到字母和空字符会返回0。因此需要把字符串中的数字单独提取到另一个数组中。于是我自己写了一个函数,只要给出数字第一位的下标就能把整个数字转化为浮点型。其实写起来不难,但是调试了挺久。代码如下:#include原创 2014-01-25 16:17:36 · 664 阅读 · 0 评论 -
UVa 10361 - Automatic Poetry解题报告
这道题是简单的字符串处理的题目,题目虽然简单,但是可以积累编程技巧和经验,对于我这样的初学者是应该说是很有帮助的水题。题目本身反而不重要,重要的是在解题过程中发现的自己的错误,想学好算法就一定要脚踏实地,不能眼高手低。#include #include using namespace std;char s1[5][101], s2[101];int main(){ //freo原创 2014-01-24 16:29:22 · 562 阅读 · 0 评论 -
UVa 10010 - Where's Waldorf? 解题报告
一道简单的字符串判断问题,问题的关键在于如何从八个方向判断匹配的单词。用八个条件语句就可以了。具体条件见代码。另外,有一些值得注意的处理细节:一,预处理,题目表示不区分大小写,所以可以把所有字母用大写形式存储。二,The outputs of two consecutive cases will be separated by a blank line.每个输入方案都要用一个空白行隔开原创 2014-01-24 13:15:12 · 620 阅读 · 0 评论 -
poj 2288 Islands and Bridges 状态压缩dp(附详细注释)
设无向图 G=(V, E),其中 V 是点集,E 是边集, n=|V| 表示图中点的数量,m=|E| 表示图中边的数量 Hamilton 通路:经过图 G 中每个节点一次且仅一次的通路称为 Hamilton 通路 特点:包含图 G 中所有顶点,通路上各顶点不重复Hamilton 回路:经过图 G 中每个节点一次且仅一次的回路称为 Hamilton 回路转载 2013-12-07 10:08:46 · 1007 阅读 · 0 评论 -
poj1458 Common Subsequence 最长公共序列 解题报告(附详细分析)
这道题是动态规划的典型题目。动态方程:if(str1[i] == str2[j])MaxLen[i][j] = MaxLen[i-1][j-1] + 1;//比较到两个字母相同时,把前一状态的值加1就得到当前的最长公共序列elseMaxLen[i][j] = max(MaxLen[i][j-1], MaxLen[i-1][j]);//比较到两个字母不同时,分别将两个字符原创 2013-11-27 22:05:36 · 716 阅读 · 0 评论 -
poj 1080 Human Gene Functions 解题报告(附详细分析)
动态规划题,是最长上升子序列的变形原创 2013-11-27 22:19:08 · 968 阅读 · 0 评论 -
POJ 1631 Bridging signals 解题报告(附详细分析)最长上升子序列的dp+二分
这道题是最长上升子序列的问题。常规思路是用动态规划,时间复杂度是n ^ 2,结果会超时。思路:input 1 7 3 5 9 4 8dp[1]=1;因为7>1dp[2]=dp[1]+1=2; 因为3>1, 3<7,dp[3]=dp[1]+1=2;因为5>3, 5dp[4]=dp[3]+1=3;因为9>5,dp[5]=dp[4]+1=4;因为43原创 2013-11-26 23:02:19 · 776 阅读 · 0 评论 -
动态规划Always On the Run poj 1476解题报告(附详细分析)
这道是动态规划,动态方程不难想,只是要实现数据的录入需要一些技巧。以第i次飞行和第m个城市作为状态dp动态转移方程:dp[i][m] = min {dp[i][m] ,,dp[i-1][j]+map[j][m][p]} 其中的map[i][k][p]是指第j城市到第k城市的第p个航班的费用,具体看代码和注释。#include using namespace std;const原创 2013-11-23 11:39:03 · 1221 阅读 · 0 评论 -
水题poj1423 解题报告
poj1423是一道纯数学题目,原题的意思是输入一个数1 这道题目的数据庞大,达10^7,高精度模拟显然不行。因此n我们必须另外想方法。 要知道一个数字的位数是多少,我们可以用log10函数求得。例如,对于一个数,N=10,10!=3628800,而log10(3628800)=6.559763033,那么只要将这个数向上取整,就是7,就是10!的位数。于是我们可以得到原创 2013-11-11 22:22:22 · 692 阅读 · 0 评论 -
UVa 10878 - Decode the tape 解题报告
题目需要我们从例子中找到破译的规律。观察可以发现全部有7个位置的o决定字母,联想到ASCII用7位表示字符。对于其中表示空格的密码,把行中的空格看作0,“o” 看作1,则可以得到二进制数0100000,正好是32。#include #include using namespace std;int value;int a[] = { 0, 0, 64, 32, 16,原创 2014-01-26 22:58:36 · 569 阅读 · 0 评论 -
UVa 644 - Immediate Decodability解题报告
一道简单的字符串匹配题,一开始我理解错了题目,并且一直runtime error。最后才发现其实是题目被我复杂化了,而且错误是数组越界。两个深刻的教训:一是认真审题二是变量和数组一定要初始化三是循环最后记得把数据清零,不然会影响下面的测试#include #include #include using namespace std;char codes[100原创 2014-01-28 13:50:40 · 674 阅读 · 0 评论 -
UVa 10115 - Automatic Editing解题报告
一道字符串匹配处理题目。核心是字符串的提取和拼接。如果用c++的string,这道题很容易解决,也可以用c的字符串处理函数做,个人觉得c的语法更接近编程语言的底层,因为要深入到每个字符的操作,而c++的string让字符串的处理变得简单,这提供了方便,但是个人觉得像我这样的初学者最好不要用封装的string,这样失去了深入了解编程语言的机会。现在我也可以理解为什么在网上看到一些人建议初学者原创 2014-01-28 19:00:08 · 642 阅读 · 0 评论