![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UVa
文章平均质量分 68
buxizhizhou530
这个作者很懒,什么都没留下…
展开
-
UVa 10603 倒水
题意:有3个有一定容量的杯子,给定一个水的量。问是否能让一个杯子装这个给定容量的水,以及所需要倒来倒去的水的最小量。如果不能,则能倒出的比给定容量小但最接近的量,以及所需要进行倒的水的最小量。思路:虽然是隐式图搜索的问题,其实和之前数据结构基础章节的图的题很类似,就是一个状态转换,然后深搜或宽搜。只不过这里状态的变换不是像之前那样是固定的,可以用一个多维数组来表示;这里的变换是倒水后三个杯子的原创 2015-03-18 12:51:10 · 852 阅读 · 0 评论 -
UVa 10305 给任务排序
题意:给定一些任务,和任务序列 i j,意思是要求任务 i 必须要在任务 j 前完成。给出这样的任务序列。思路:拓扑排序。注意的是任务是从1开始的到n。Code:#include#includebool dfs(int u,int n);bool toposort(int n);int graph[105][105];int topo[105];int t;in原创 2015-02-04 21:05:13 · 982 阅读 · 0 评论 -
AOAPC-I: 算法竞赛入门经典 UVa 习题集分类
数据结构基础UVa 10004 二染色:二部图的判定。(bfs或dfs遍历的过程进行染色,看是否有冲突)UVa 10129 单词:有向图的欧拉道路。UVa 10054 项链:无向图的欧拉回路,首尾相接输出路径。UVa 10596 清晨漫步:无向图的欧拉回路。(对于欧拉道路或回路,在判断连通性等时注意先 if 下要访问的顶点是否出现。)原创 2015-02-04 13:57:32 · 1620 阅读 · 0 评论 -
UVa 10054 项链
题意:有一串珠子,每个珠子的前半部分和后半部分都有一种颜色。两个珠子颜色相同的部分,可以连到一起。给定一些珠子看是否能用所有这些珠子串成一个项链。思路:将每个颜色看做一个顶点,每个珠子对应一种颜色到另一颜色的无向边。每个珠子只能用一次,相当于每条边只能用一次。欧拉回路。不过不同的是,这道题需要输出欧拉回路的路径,而且下一路径的起点必须是上一路径的重点。我觉得难点是在这个路径的输出上。 开始的时候我是在dfs()里用 printf("%d%d",n,i); dfs(i);(方式1) 这样是不能满足要求原创 2015-02-03 18:09:48 · 960 阅读 · 0 评论 -
UVa 10596 清晨漫步
题意:有很多路,问能否每条路只走一遍、恰好回到起点?思路:无向图的欧拉回路的应用。但是是神坑的一道题~ 注意:考虑下面的数据Input:3 20 11 02 21 01 04 40 11 02 33 25 60 11 02 32 30 22 04 61 22 12 32 3原创 2015-02-03 16:41:54 · 1021 阅读 · 0 评论 -
UVa 10004 二染色
题意:给定一个无向图,是强连通的,而且无自回路。对顶点进行染色,相邻的顶点需要用不同的颜色,但总共只有两种颜色,是否可行。思路:二部图的判定。其实通过题意思考,也可以发现,如果没有回路是可以的,如果有回路,而回路的顶点个数是偶数个也是可以的,是奇数个则不行。而这正是二部图的充要条件:无向图的所有回路长度都为偶数。 但这里如何判断回路长度不好实现。 这里的思路是,对图进行遍历,dfs或bfs原创 2015-02-01 01:14:47 · 1252 阅读 · 0 评论 -
UVa 10129 单词
题意:给定一些单词,单词的尾字母和另一单词的首字母相同,则可以串联,问是否可以将所有的单词串联。单词可重复出现,但每个单词只能用一次;即某单词重复几次,则可用几次。思路:欧拉道路的应用。欧拉道路,即“一笔画”,从图中一结点出发走一条道路,每条边恰好经过一次。 首先要判断图是连通的。 对于无向图,最多只有两个奇点(度数为奇数)。且从一奇点出发,原创 2015-02-01 01:37:28 · 1225 阅读 · 0 评论 -
UVa 10047 独轮车
题意:独轮车均分为5个部分即五种颜色,每次前进一格恰好换一种颜色接触地面。要求从起点走到终点,但是起点时人是面向北的、绿色接触地面,终点时需要绿色接触地面、朝向哪无所谓。其中,在每个格子,有三种选择,要么前进一格,要么左转90度,要么右转90度。每种选择都是耗时一秒。思路:将每种约束都看做一个属性,或者说一个状态由4元组决定:横坐标、纵坐标、方向、颜色。这样起始状态知道、终点状态知道,进行bf原创 2015-01-28 22:15:42 · 1528 阅读 · 1 评论 -
Uva 439 骑士移动
题意:骑士移动是只能走一个日字的对角线,就像象棋里的马一样。这样计算棋盘上从一格到另一格的最短移动次数。思路:一般,最短次数和 bfs 有关。用bfs先计算从每个格子到其他所有格子的最短距离,后面在遇到输入示例时查表即可。这里用一个四维数组,开始二维代表从棋盘的每一个格子作为出发点,后面两维为棋盘上的每个格子。Code:#includevoid preprocess(int a,i原创 2015-01-27 14:13:26 · 657 阅读 · 0 评论 -
UVa 532 三维迷宫
题意:三维迷宫,可以往前后左右上下8个方向移动。思路:8个方向的移动对应8种三维坐标的变化。这里三维坐标还是按照高、行、列为x、y、z的顺序。和二维迷宫类似,但二维可以把行列统一为 行*长度+列,三维却不可以,只能用结构体。直接用结构体数组表示队列即可,结构体之间可以直接赋值。Code:题意:三维迷宫,可以往前后左右上下8个方向移动。思路:8个方向的移动对应8种三维坐标的变化。这里三维坐标还是按照高、行、列为x、y、z的顺序。和二维迷宫类似,但二维可以把行列统一为 行*长度+列,三维却不可以,只能用原创 2015-01-27 15:26:32 · 916 阅读 · 0 评论 -
UVa 548 树
题意:给出中序和后序序列,求从根到叶子结点这样路径和值最小的叶子结点。如果和值相等,则选择叶子结点值较小的那个。思路:由中序和后序序列递归地构造二叉树。顺序存储显然不行,使用链式存储。由于每个结点输入的是数字而不是字母,这里采用整型数组来存的,而不再是字符串,可能更方便些。build(n,a1,a2)函数是利用中序序列a1和后序序列a2构造有n个结点的二叉树,返回根结点指针。递归构造出二叉树后原创 2014-08-26 19:30:01 · 916 阅读 · 0 评论 -
UVa 657 掷色子
题意:就是有一张大图,每个像素即格子只可能是 . * X 三种,分别代表背景、色子、色子的点数。两个格子是相邻的或连通的,当且仅当两个格子是*或X,且有公共边,即上下左右四个方向,对角不算,即四连块。将一个连通块看做一个色子,将这个连通块中的X的连通块个数看做该色子的点数。思路:两次深搜。第一次是由*和X来深搜每个连通块,在深搜每个连通块时由X来深搜X的连通块个数。这里可以通过两个标记数组vi原创 2014-09-03 22:03:47 · 935 阅读 · 0 评论 -
UVa 784 迷宫探索
题意:迷宫里有X作为墙,空格为可通过,*标记起点。然后需要你现在来刷墙,刷那些由起点可达的房间的墙,即找由起点可达的连通块。这里题目说墙是除几个字符之外的可打印字符,没有说是X。做题时当成了X,结果AC了~题目说到墙都是3格子宽1格子厚,好像也没什么用~思路:输入时找到起点并记下,然后由起点深搜。注意:从网站拷贝样例数据到txt时,它自动地少了很多空格,导致这个测试数据时不符合题意的。(不原创 2014-09-04 14:56:23 · 946 阅读 · 0 评论 -
UVa 123 快速查找
思路:题目是先给出一系列要忽略的词(感觉像中文分词时候的去除停用词),然后在一系列titles中找keyword并排序输出。这里排序首先是按关键字的字母序,如果两个title有相同关键字,就按输入时title先出现的顺序;如果一个title里出现同一个词多次,就按该词在该title里的先后顺序输出。所以可以把keyword定义为一个结构体,然后给结构体排序,给结构体的排序用到的是qsort么,而q原创 2014-03-21 18:39:50 · 1579 阅读 · 2 评论 -
UVa 10562 看图写树
题目:题目就是给出一幅ASCII字符构成的树的图,然后转换成由字符括号构成的树的表示形式。可以知道,树有孩子结点的话,正下方会有一个字符 '|' ,紧接着会有一个覆盖所有孩子结点的字符序列“-------”,然后其下就是孩子结点。思路:先将所有数据读下来。然后递归处理,给定一个左右边界,在该边界内逐个检查字符,如果是结点字符,则判断有无孩子等后续处理。注意:因为每行会有空格,所以不能用sc原创 2014-08-29 21:07:53 · 1063 阅读 · 0 评论 -
UVa 839 天平
题意:天平的两端,每端的重量 wl 和 wr ,每端到中点的距离 dl 和 dr ,要满足wl*dl==wr*dr才能保持天平平衡。天平的每端可以再系一个天平,该端的重量为该子天平的总重量。问最终天平是否能平衡。 这里的天平是指上面竖直一根系,系着一个水平的金属棒,金属棒的两端挂物体,要保持平衡,不要想成了放在桌子上的那种天平。 题目Not so mobile 翻译成天平应该是意译了吧,觉得还原创 2014-08-29 16:38:46 · 1162 阅读 · 0 评论 -
UVa 196 电子表格
题意:给定一些电子表格,每个单元格里要么是整数要么是公式,公式是=号开头的,用+号连接的字符串。公式中要用到其他单元格的值,而要用到的其他单元格,可能还是个公式。但可以保证,不会形成单元格的环形的引用。其中,行的标号范围是从1到999,列的标号范围是从A到ZZZ。要求在输出的时候将公式替换为数值。思路:很容易可以看到这和拓扑排序有关,一个单元格值的计算必须要在另一个的之前完成。但是这里没有必要原创 2015-02-05 17:06:55 · 869 阅读 · 0 评论 -
UVa 10167 生日蛋糕
题意:有一个半径为100的圆形蛋糕,蛋糕上有一些樱桃。现在妈妈要把蛋糕分两半,因为要均分给两人,所以肯定是从原点切出来的。然后还需要两半蛋糕各含一半数目的樱桃,而且所切的地方不会切到樱桃。求所切下的这条直线的方程,Ax+By=0 中的 A 和 B 的值。cherry 樱桃;beeline 直线;coordinate 坐标思路:可以看到大体的思路就是找到一条直线,使得所有樱桃的坐标满足 Ax原创 2015-02-06 23:48:31 · 831 阅读 · 0 评论 -
UVa 11205 损坏的步数计
题意:有一组编码,用其中最少的位数来区分这些编码。思路:相当于枚举一个集合的所有子集,然后选择符合要求的势最小的集合。 子集生成有三种方法,但每一种子集的生成都没有明显的规律,至少不是从1个元素、2个元素到n个元素这样的顺序生成的,所以还是要枚举出所有的子集才行。这里用的增量构造法来枚举子集。Code:#includevoid print_subset(i原创 2015-02-26 12:56:59 · 1022 阅读 · 1 评论 -
UVa 208 救火车
题意:先给出离出火地点最近的路口,然后给出一些之间通畅的路口。要求给出所有从1号路口到火灾事故点的不含回路的简单路径。思路:方法很容易想到,dfs即可。但是简单的dfs会超时,3s+. 之后看别人用了并查集,去了解了下并查集的思想。这里可以通过并查集提前判断一个路口是否和火灾路口想通,如果不通,则直接剪枝了。别看仅这一个优化,最后AC时间0.022,性能提升还是很多的。因为你早早地剪去一个结点原创 2015-03-12 21:29:45 · 797 阅读 · 0 评论 -
UVa 193 图着色
题意:给一个图,可以染白色和黑色,但是染黑色的结点不能相邻。求最多的黑色结点个数,和一种可能的黑色结点序列。思路:这个用回溯法还是很容易想到怎么写的。dfs每一个位置,知道所有位置dfs完。对每个位置都尝试黑色和白色。如果染黑色,那么就需要把和它相邻的结点染成白色,因为他们必须是白色,如果发现有相邻结点已经是黑色,则当前结点不能是黑色;而因为dfs后需要对辅助的全局变量进行恢复,所以这里在将相原创 2015-03-09 11:08:25 · 742 阅读 · 0 评论 -
UVa 140 带宽
题意:参考之前讲回溯法的最后一个问题。思路:枚举全排列,考察每一种排列下的结果。 也可以进行剪枝优化,也是参见之前讲回溯法的部分。这里我是用二维数组g来存边关系,但顶点还是单独保存在一个数组里,然后排序,然后求排列。这题居然交了9次,1CE1TLE1AC6WA,CE的原因是没有包含cstring,在本地没包含可以。。。TLE原因是没有注释掉freopen。WA的原因之前一直以为是原创 2015-03-07 19:55:10 · 928 阅读 · 0 评论 -
UVa 167 苏丹的继承者
题意:类似于8皇后问题,只不过棋盘上每个格子都有个分数,皇后所在的位置即可以得到的分数。还是8皇后问题的规则,最后求得最大可得到的分数。思路:8皇后问题解法,在放完8个皇后后判断一下得到的分数就行了。在 if 语句的判断内容那块竟然还写错一次,不满意~也可以用vis[3][2*8];数组标记,然后会快一点Code:#includevoid dfs(int cur,int s原创 2015-03-07 12:07:54 · 1096 阅读 · 0 评论 -
UVa 10012 有多大 没AC,待修改
题意:给出一些圆的半径,把所有圆放到一个矩形里,要求所有圆都必须与矩形的最下边相切,求矩形的最小长度。本来写得很快,以为是一道水题,结果有太多情况没考虑。。我是按照最左圆的半径加上每两相切圆的圆心间水平距离再加上最右圆的半径写的,有太多情况没考虑。一会补上一个,缝缝补补的,现在都有些晕了,现在还遗漏的情况是,我只考虑了第二个圆比第一个圆能到更左,以及倒数第二个圆比倒数第一个圆能到更右,但是第三原创 2015-03-04 21:50:17 · 936 阅读 · 0 评论 -
UVa 331 交换的方案数 (回溯法,启发)
题意:只能交换相邻的数。要把一个数组这样交换以形成升序。问最少交换次数的不同交换顺序有多少种。思路:还是没想到,看到别人题解中一句话,茅塞顿开:每次从头选两个需要交换的位置进行交换。只有降序才需要交换,而且可以看到每次降序的调换都是有意义的。这样每次从头找一个需要交换的位置,就是不同的方案。当某次从头扫描到尾没有需要交换的位置时,则已经排好序,就是交换次数,用一个flag变量标志。0.02原创 2015-03-04 16:17:17 · 822 阅读 · 0 评论 -
UVa 10344 算23点
题意:有5个数,3种运算符:加、减、乘,用全部5个数,和4个运算符,构成一个表达式,使得值为23,这里没有运算符的优先级,全部是从左往右算。是可以这么理解,题目给的是从左到右依次打了括号。思路:这里是对表达式的位置进行dfs。可以看到第0位是数字,第1位是运算符,依次则,偶数位是数字,奇数位是运算符。dfs中把当前位置cur分为奇偶分别处理。偶数位置时,则对数字进行枚举,并计算当前表达式的值,原创 2015-03-03 20:58:14 · 911 阅读 · 0 评论 -
UVa 539 卡坦岛
题意:某游戏的玩家会建造一些公路,公路是连接两个岛的,这样形成一个图。顶点是岛,边是公路,且边长均为1。要求每条边只能走一遍,这样最长的公路是多长。思路:回溯法。以所有的点都开始枚举一次。由于这里每条边只能访问一次,而顶点是可以访问多次的,所以不能简单地用vis[26]数组来判断,而是用g[][]的值来表示边的条数,这样,输入时边的相应g值++,选择一条边时,则相应g值--。这样没要输出路径,原创 2015-03-02 22:04:53 · 815 阅读 · 0 评论 -
UVa 639 放车问题
题意:给定一个 n x n 的棋盘,在上面放置车。其中.号表示可放置,X表示墙。在同一行或同一列的两个车,如果它们之间没有X墙挡着,则是不合法的放置。给定一棋盘,最多可以放置车的数量。思路:枚举所有的格子,看是否可以在此放置。每次放一个车后,修改棋盘的横行、竖列直到X的位置为1,即不可放置。因为要修改棋盘,所以需拷贝一个过来,修改拷贝的。还有一些注意的,如注释,总感觉写得不是很简洁。还有就原创 2015-03-02 19:26:10 · 771 阅读 · 0 评论 -
UVa 216 网络连线
题意:给出一些电脑的二维坐标,连接两个电脑所用网线长为它们之间的直线距离再加上16 feet。要求把所有电脑连成一个串,怎样连,使得所用网线最短,并且按从一端到另一端的顺序输出连接的两个电脑间的距离。思路:很容易想到的就是暴力枚举,将所有电脑做一个全排列,求得总长最小值的那个。这里用的递归枚举、即回溯法,进行了剪枝优化。第一次交WA了,重读题目、看别人题解,都没找到原因。看到别人的freo原创 2015-03-02 15:18:12 · 824 阅读 · 0 评论 -
UVa 729 Hamming距离问题
题意:给定字符串的长度,以及汉明距离,求所有和全0字符串汉明距离为给定值的等长字符串,升序输出。思路:长度n,汉明距离h,相当于n-h个0和h个1的序列,进行枚举全排列。感觉这几题都是排列和子集相关的枚举额,推荐的题目没有其他的枚举或暴力求解的吗?感觉不是很好额~Code:#include#includevoid print_permutation(int n,int *P,原创 2015-02-27 14:34:14 · 804 阅读 · 0 评论 -
UVa 10098 快速生成有序排列
题意:对输入的字符串,按字典序升序输出所有种排列。思路:这个基础就是之前将到的枚举排列问题,只不过当时是整型,这里是字符型。注意:一个是输出的时候每组数组后都要输出一个空行(虽然你去复制sample out会发现最后一组数据没空行,但程序里的确是包括最后一组数据后都有空行)第二是因为这里是字符型,输出的时候直接按字符串输出即可,但是需要在排列数组的最末位加'\0'!还有,在最开始需要对原创 2015-02-27 13:10:51 · 773 阅读 · 0 评论 -
UVa 146 ID码
题意:输出一个排列的后继排列,如果是最大的降序排列,则输出没有后继。思路:调用STL中的next_permutation()函数即可。不过这个函数在求后继时是一个循环状态,即全升序是全降序的后继,循环回来了。所以在调用之前判断一下是否为全降序序列即可。 感觉用这个函数没什么技术含量,有时间用纯C写一个。Code:#include#include#includeusi原创 2015-02-27 13:05:42 · 846 阅读 · 0 评论 -
UVa 110 没有循环的排序程序
题意:构造Pascal的排序程序。初看是写Pascal程序,不了解的以为会很难,但其实程序的大部分是固定的,直接printf就可以,主要在于写比较的if-else部分。思路:看sample out可以大概知道程序的构成,其他部分直接输出,主要写比较的部分。比较的时候,可以看成两个集合,A是已排好序的,S是全集,cur是从左到右扫描S的当前位置。用递归写的,前半部分是当当前位置cur到达n时,即原创 2015-02-28 13:17:39 · 830 阅读 · 0 评论 -
UVa 131 有超能力的纸牌玩家
题意:题目描述太简单了,简直需要猜题目。看别人的题解也知道题目意思。大致意思是,手里五张牌,可以弃0~5张,然后从牌堆的5张中拿最上面的同等数量纸牌,使得value最大。value的评价真的是要猜。。。依次为:straight-flush 同花顺four-of-a-kind 炸弹full-house 满堂红 三张同点牌加上一对 flush 同花straight原创 2015-02-26 18:58:27 · 941 阅读 · 0 评论 -
UVa 327 计算简单C表达式
题意:给出一个C表达式,计算其值。其中操作数只有26个字母,从a到z依次初始值为1到26;操作符有二位的 + 和二位的 - ,和正常意思一样,然后还有一位的自增 ++ 和一位的自减 - - ,都有前缀和后缀两种,都和正常理解的一样。然后计算表达式值,并给出式子中的各变量最后的值。对了,每个变量在表达式中最多只出现一次。思路:题目最后也有给出思路,就是将所有一位操作符即自增和自减操作符去掉,再将原创 2014-08-29 14:13:19 · 1140 阅读 · 0 评论 -
UVa 712 S树
题意:有一棵完全二叉树,每层元素有同一变量表示,从上到下分别为x1,x2,... 最后一层叶子结点会有0或1的赋值,输入给出。然后如果xi取值为0时,则往左子树走,否则往右子树走,直到走到叶子结点,得到一值。思路:因为是完全二叉树,可以用顺序存储,数组实现即可。另外也只需存叶子结点的值就行了。对一结点k来说,左孩子是2k,右孩子是2k+1。因为高度最大为7,最多有x7,所以可以直接取数组的第二原创 2014-08-27 20:35:57 · 1039 阅读 · 0 评论 -
UVa 299 列车调度
思路:好吧,这是一道水题。。(这样说是不是太不好了?)主要就是求逆序对数,即 ia[j]的总个数 记得算法导论里分治法排序那部分有提到逆序对问题。本来打算用分治法的,发现这题规模比较小,而且按照白书的安排,好像暂时不需要这样的算法~结果直接O(n2)的算法就过了~Code:#include#define N 55int num[N];int main()原创 2014-03-13 00:16:47 · 922 阅读 · 0 评论 -
UVa 120 煎饼堆
思路:flip i操作是从第0个到倒数第i个数颠倒、即对调位置。题目是要求将每组数据进行变换到升序的操作序列。思想是从后到前来排,先排最大的数字到其正确的位置,然后依次。所以,首先要将其排序,找出数字间的顺序关系。然后搜索要排的数字a在现在序列中的位置x,找到该位置后,肯定是进行此位置的flip操作,即flip x,将其变换到首位置,然后再进行一次flip y位置,将首位置的该数据放在y位置。原创 2014-03-15 00:49:42 · 1538 阅读 · 0 评论 -
UVa 400 Unix的ls命令
题目:题目是要对输入的每组文件名进行规则化输出,除了最后一列,其他列的宽度为maxlen+2,最后一列宽度为maxlen。maxlen为最长字符串的长度。(这个题看了好几遍都没看懂题意,最后google出来的才从博客明白此题题意。。之前自己一直是在数每列最长字符串后的空格数,总是明白不了题意。The rightmost column will be the width of the longest原创 2014-03-17 01:48:09 · 1748 阅读 · 0 评论 -
UVa 156 反片语
题目:题目是要找出ananagram。什么是ananagram?它是anagram的反面。anagram是什么呢?就是在给定字典中可以通过字母重排得到的字符串,而且忽略大小写。(因为看错了那两个单词,一直对ananagram的定义很困惑,因为一会儿感觉字母重排可得到的是,一会儿感觉字母重排不可得到的是,其实那是两个单词。)思路:先对输入词典进行词典排序,构建每个词的对应的顺序单词(即每个词在原原创 2014-03-16 01:20:24 · 1649 阅读 · 0 评论