
算法竞赛入门经典——训练指南
文章平均质量分 69
-sky-
这个作者很懒,什么都没留下…
展开
-
例题1.5 蚂蚁 UVA - 10881 等效变换+排序
传送门 题目大意:一根长度为L的杆上有N只蚂蚁,每只蚂蚁要么往左爬,要么往右爬,速度为1.两只蚂蚁相撞,同时掉头。杆子最左端为0,问T间时各蚂蚁的位置和方向。 解题思路:两只蚂蚁相撞与穿过效果一样。因此我们直接计算蚂蚁相遇直接穿过的结果即可。但是我们需要记录每只蚂蚁的方向,其实我们按照穿过计算时,朝左的个数和朝右的个数以及顺序不会变,但是蚂蚁的位置变了,但是真正蚂蚁的相对位置没原创 2017-08-08 15:46:54 · 277 阅读 · 0 评论 -
例题1.25 侏罗纪 Jurassic Remains UVALive - 2965 状态压缩 + 中途相遇法
传送门 题目大意:给定n个大写字母组成的字符串,选定尽量多的字符串,使每个字母出现的次数均为偶数,输出选择字符串的数量以及他们的序号 解题思路:每个字母有两个状态(奇数和偶数) 因此可以进行二进制压缩(假设1表示奇数,0表示偶数),可以得到一个整数。一个字符串压缩成了一个整数。 然后每个字符串进行异或, (1 xor 1 = 0, 0 xor 0 = 0, 1 xor 0 = 1) 符合题原创 2017-09-03 12:45:48 · 272 阅读 · 0 评论 -
例题1.22 最大子矩阵 City Game UVALive - 3029 扫描法
传送门 题目大意:给定一个m×n的矩阵,F代表空地,R代表障碍,让你找出最大的一个没有障碍的矩形阵地,输出矩阵的面积×3 解题思路:每一个格子我们都当底,可以计算出他之上有的空地有多高,再遍历一次,用当前块的高度扫描左右,只要左右的高度比这个高即可,可以求出宽度,维护最大的面积即可。维护高度的时候有个小技巧,不需要遍历,只需看它上面一个是不是空地,如果是,当前的就是上面那个高度+1 AC代码原创 2017-09-02 08:59:31 · 311 阅读 · 0 评论 -
旅行 The Trip, 2007 UVA - 11100 构造&输出技巧
传送门 题目大意:n个背包,然后给n个背包的大小,然后把所有的包打包起来,(把小包放到大包里面),使打包起来的包最少,即:给定一个整数序列,找出尽量少的增序列,输出最少的序列个数,以及每个序列。 解题思路:背包不能一样大,因此出现次数最多的那个包的个数就是总的打包数量maxsize,即最少序列个数maxsize。先排序,然后每隔maxsize取一个数,保证不会出现重复的情况。每个背包都比上一个原创 2017-09-10 22:59:56 · 216 阅读 · 0 评论 -
The Tower of Babylon UVA - 437 多状态 , dp
传送门 题目大意:有n种长方体, 每种有无限个, 要求选一些长方体,摞在一起尽量高,要求上面立方体的长和宽严格小于下面的长方体,每个长方体可以旋转,即每个边都可以做高。 解题思路:每个长方体都有三种状态,即三个楞分别为高的状态,d数组保存每个长方体不同状态时在至最低部能摞最高的高度。记忆化搜索即可,用了一个小技巧,即d(a,b)表示第a个长方体第b条楞为高的状态,用get函数即可求出长和宽。原创 2017-09-16 15:54:08 · 220 阅读 · 0 评论 -
例题1.19 老式计算器 Calculator Conundrum UVA - 11549 Floyd判圈法
传送门 题目大意:一个老式计算器,只能显示n位,于是输入一个整数k,一直平方,如果溢出,只显示前n位。然后这个n位数继续平方,所有的数中输出最大的那个。 解题思路:由题目可知一定有无限循环。因此只要找到循环节即可。标记一下是否出现过,如果出现过那么平方以后结果是一样的。 AC代码: #include #include #include #include #include原创 2017-08-29 22:52:59 · 457 阅读 · 0 评论 -
例1.11 新汉诺塔问题 A Different Task UVA - 10795 中间状态+逆向思维
传送门 题目大意:标准的汉诺塔上有n个盘子,然后给定两个状态,初状态和目标状态,即每个盘子的位置。求出初装态到目标状态需要最少的步数 解题思路:汉诺塔问题我们知道,1,2,3,4。。。个盘子移动到另一个柱子需要的步数为:1,3,7,15,,,,即前一项的两倍再加一。在考虑另一个问题,当最大的盘子在目标位置时就不需要移动,那么就找第二小的盘子,找到一个盘子时,那这个盘子就是需要移动的最大的盘子,原创 2017-08-11 17:10:26 · 782 阅读 · 0 评论 -
例题1.4 Graveyard UVALive - 3708 数学思维题
传送门 题目大意:有一个周长为10000的圈,以前有n个雕像,现在要加进去m个,以前每个雕像之间距离是相等的,加进去之后也要相等。求移动原来雕像最少的距离。新的雕像可以添加到任意位置。 解题思路:我们可以求出原来的间隔和现在的间隔。移动距离最少就要把原来的雕像移动到最近的一个点。因此我们将原来的雕像移动到它前后两个点的近的那一个位置就好。因为新添了雕像,所以新的距离比原来的原创 2017-08-07 14:46:02 · 272 阅读 · 0 评论 -
Spreading the Wealth UVA - 11300 找规律+数学推导
传送门 题目大意:有n个人围成一圈,每个人有ai个金币,每个人可以向相邻的人传金币。求出需要传递最少的金币数目使得每个人手中的金币数相等,数据保证金币总数时n的倍数。 解题思路: 我们设第i个人向前一个人传递xi个金币。并且我们可以求出每个人平均有多少个金币:M = sum/n; 那么: A[i] + x[i+1] - x[i] = M =原创 2017-08-07 08:45:45 · 212 阅读 · 0 评论 -
Commando War UVA - 11729
传送门 水~~~~ 题目大意:你给n个士兵安排任务,每个士兵安排任务的时间为bi 执行时间为ji ,同一时间只能给一个士兵安排任务,但是士兵执行任务不妨碍给其他士兵安排和执行。求出最短的时间。 解题思路:贪心,无论怎样,执行时间长的就要先安排,因为安排了其他的,他就是最后,所以把所有最后完成的都提到前面,先执行,因此排序即可。 AC代码: #include #includ原创 2017-08-06 10:38:44 · 220 阅读 · 0 评论 -
Dragon of Loowater UVA - 11292
传送门 题目大意:有一个恶龙有多个头,勇士雇佣人砍掉他所有的头, 每个勇士的能力为x的话,佣金也为x, 能力为x的勇士能砍掉直径为小于等于x的头。这个勇士想花最少的佣金砍掉恶龙所有的头。每个勇士只能雇佣一次。水~~~~ 解题思路:算是贪心法吧,一开始我想到的是进行匹配。对恶龙和佣兵进行排序,从小到大遍历恶龙,找到最小的勇士砍对应的头。如果勇士不够就不能砍掉所有的头。代码写完跟题解差不多..原创 2017-08-06 09:17:01 · 197 阅读 · 0 评论 -
Children's Game UVA - 10905 整数按字符串读入
传送门 题目大意:读入n个整数,链接成一个大数, 使大数尽可能的打 解题思路:按字符串比较即可,221,和 22 ,直接比较221>22但是22221要大于22122,所以要比较链接之后的,即a+b>b+a; AC代码: #include #include #include #include using namespace std; string str[60]; boo原创 2017-08-20 16:25:40 · 229 阅读 · 0 评论 -
例题1.14 填充正方形 Fill the Square UVA - 11520 搜索
传送门 题目大意:有一个n*n的表格,有的已经填充了大写字母,你要吧所有的空格子都填上大写字母,要求有公共边的格子里字母不能相同,如果答案有多个,按照从上到下,从左到右的字典序最小的输出。 解题思路:直接遍历每一个格子,从A开始试,只要上下左右不一样就填充 AC代码: #include #include using namespace std; char mp[11][11原创 2017-08-13 15:10:30 · 286 阅读 · 0 评论 -
例题1.13 派 Pie UVALive - 3635 二分
传送门 题目大意:你和你的f个朋友分蛋糕(也就是一共f+1个人),有n个蛋糕,要求每个人分到的一样多,并且蛋糕不能拼接。可以有剩余。求每个人最大能分到的面积是多大。给定n个蛋糕的半径。 解题思路:直接二分即可,答案一定在0和最大的蛋糕面积之间。我们测试x是否可以,我们只需检测可以切下多少个x面积的蛋糕,只要够f+1块即可。本题与白书割绳子例题一样。 AC代码: #include原创 2017-08-13 10:52:07 · 254 阅读 · 0 评论 -
例题1.12 组装电脑 Assemble UVALive - 3971 模拟或者二分
传送门 题目大意:你有b块钱,要组装一台电脑,给n个配件,每个配件给出种类,名称,价格,品质。电脑整体水平取决于最差的哪个配件的品质,因此要求最低的品质的配件的品质尽可能的大。输出组装的电脑配件里面最低的品质的最大值。 解题思路:首先我想到的是都买最便宜的,然后有钱就把最差的换的稍微好一点。不断更新。因为每次提升都是把最差的变好,那么就会更新到最大值。更换配件时我们都买最便宜的换掉当前品质最差原创 2017-08-12 13:21:56 · 358 阅读 · 0 评论 -
例题1.7 偶数矩阵 Even Parity UVA - 11464 部分枚举+递推
传送门 题目大意:给你一个n*n的01矩阵,你的任务时把尽量少的0变成1,使得每个数字的上下左右之和为偶数。只算存在的 解题思路:全部枚举时不可能的,枚举第一行的变化,那么第二行行就可以递推出来。(因为第一行上面一行不存在,所以是三个的和)。 那么第三行就可以根据第一行和第二行推出。 AC代码: #include #include #include #include #i原创 2017-08-10 17:48:20 · 446 阅读 · 0 评论 -
例题1.8 彩色立方体 Colored Cubes UVALive - 3401 暴力打表+暴力搜索+贪心
传送门 题目大意:有n个带颜色的立方体,每个面都涂有不同的颜色,要求图改尽量少的面,使得所有立方体完全相同,立方体可以旋转。 解题思路:如果立方体每个面都不一样,那么立方体通过旋转一共有4×6=24中状态。我们给每个面标号0,1,2,3,4,5 那么旋转可以生成24中序列。这个序列手写很麻烦,可以用程序生成。然后将这二十四个状态当作常量表,直接使用即可。 第一个立方体作为参照,然后就是枚原创 2017-08-11 12:36:48 · 420 阅读 · 0 评论 -
例题1.15 UVALive-3902 树上的搜索
传送门题目大意:n台机器连成一个树状网络,叶节点是客户端,其他节点是服务器,一开始只有一台服务器提供一种服务,但它只能覆盖k的距离内的客户端,你让尽量少的服务器提供这项服务,使得所有的客户端都被覆盖。解题思路:我们将这个无根树转换为有根树,那么提供服务的服务器就是根节点,那么k深度以内的叶节点都被覆盖了,因此我们只要找k以下的即可。从最深的节点开始找,它需要被覆盖,距离它k距离的服务器提供服务是最...原创 2017-08-15 11:39:28 · 475 阅读 · 0 评论