算法竞赛入门经典第二版第八章例题+习题
樂_smile
这个作者很懒,什么都没留下…
展开
-
UVa 1624 打结(Knots)
略代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))#define REP(i, a, b) for(int i = (a); i < (b); i++)#define INF 0X7fffffffusing namespace std;const ...原创 2019-12-05 22:15:43 · 310 阅读 · 0 评论 -
UVa 11175 有向图D和E(From D to E and Back)
题意:给一个n个节点的有向图D,可以构造一个图E,D的每条边对应E的一个节点,对于D的两条边uv和vw,E中的两个节点uv和vw之间连一条有向边,E中不包含其他边。输入一个m个节点k条边的图E,判断是否存在对应的图D。E中各个节点的编号为0 ~ m-1分析:主要是通过测试样例的第三个NO分析出来的,可以发现对于这个图之所以不可能成立,是因为在D图内,显然还有 uv -> vg 也就...原创 2019-12-04 12:37:19 · 528 阅读 · 0 评论 -
UVa 10366 龙头滴水(Faucet Flow)
题意:一个水龙头在x = 0处不断地滴1体积的水,问要多少体积的水,才可以从左边或者从右边流出,注意,水龙头的滴水没有指向性,则例如水龙头的两边隔板高度有相同的情况下,会匀称的往两边滴。分析:其实就是有点爬坡的算法。接下来俺绘制图形来说明这个问题。总之细节就是均摊水的地方,其他的就爬坡就好了代码如下:#include<bits/stdc++.h>#define L...原创 2019-11-30 00:07:17 · 288 阅读 · 0 评论 -
UVa 1623 神龙喝水(Enter The Dragon)
题意:神龙可以在没有下雨的时候喝掉一湖水, 一开始所有河都有水,另外,如果一个湖已经有水了,再下雨,这个湖就会闹水灾,如果一个湖原本没水,下雨了,就满水了,此时不会闹水灾,问是否可以做到不闹水灾,如果可以输出“YES”,且输出不下雨天喝哪河的水,也可以不喝水,这个时候输出0,否则输出“NO”分析:紫书上说需要优化算法 看到1e6的数据,很自然的想到nlogn的算法怎么样才可以nlogn呢?...原创 2019-11-28 23:07:35 · 260 阅读 · 0 评论 -
UVa 1622 机器人(robot)
题意:给定一个r * c的网格 (1 <= r , c <= 1e5) ,在这个网格里面均分 1 * 1的小格子, 每个格子初始都有一个机器人,你可以执行n, s, w, e指令,让所有机器人分别向上向下向左向右移动,出边界的机器人会爆炸,以后再也不会听从指令,求最大指令数。这里可能没有描述清楚我们以一个样例为解答例如 2 2 1 1 1 1代表有2 * 2 的网格 有四个机器...原创 2019-11-28 22:04:31 · 442 阅读 · 2 评论 -
UVa 1620 Lazy Susan(懒惰的苏珊)
题意:给你一个圆盘,你可以找连续的4个数进行翻转,问是否能翻转成 1, 2, 3, 4 …… n 这样的形式分析:注意到是圆盘,我们证明下列两个条件。如果n为偶数,那么一定存在序列是偶数序列例如 1 2 3 4 由于是圆盘可以视为, 2 3 4 1 这样,那么此时的逆序对变为3可以这样证明 如果第一个元素和全体后面元素的逆序对为k那么将第一个元素放到最后 这个元素和前面所有元素的...原创 2019-11-26 17:25:47 · 258 阅读 · 0 评论 -
UVa 1312 球场(Cricket Field)
题意:一个 W*H的网格里有n棵树,要求找一个最大空正方形。分析:树的棵数为 1~100个如果遍历所有的树,每次枚举两个树之间的上下限,在从左到右枚举两个树之间的左右限,需要O(n^4) 1e8数量的算法,会超时。那么在从左到右枚举的时候可否优化呢。答案是可以的。如果前面的树的y不在枚举的两个树的上下限内部的话,那么不影响后续x但是如果枚举的y在两个树的上下限内部的话,(不包括边...原创 2019-11-26 16:45:40 · 306 阅读 · 0 评论 -
UVa 1619 感觉不错(Feel Good)
题意:找到一个连续的子序列 令 e = 这段连续子序列的和 * 这段连续子序列中的最小值, 求令e最大的区间和e的值分析:可以考虑用单调递增栈做,同时注意用LL用单调递增栈的算法复杂度为O(n)代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using...原创 2019-11-25 22:31:29 · 312 阅读 · 1 评论 -
UVa 11536 最短子序列(Smallest Sub-Array)
题意:有n个0~m-1的整数组成一个序列。输入k,你的任务是尽量找到一个短一点的连续子序列使得该序列包含1-k的所有整数。最大序列是生成的,生成在代码中分析:二分查找一个位置,长度a不成立 b成立 那么答案就在 (a, b] 之间,也就是这个时候不成立,左端点 + 1 右端点成立,右端点可以不变,也就有了代码里面的check后的变化。代码:#include<bits/stdc++...原创 2019-11-24 01:28:57 · 558 阅读 · 0 评论 -
UVa 1618 弱键(Weak Key)
题意:给出k个互不相同的整数组成的序列N,判断是否存在4个整数, Np,Nq,Nr,Ns (1<=p<q<r<s<=k) 使得 Nq > Ns > Np >Nr 或者 Nq < Ns < Np < Nr;分析:主要根据s p 来做选择 首先要保证 a[s] > a[p] 然后保证 a[q] > a[s] a[p] ...原创 2019-11-17 13:59:36 · 327 阅读 · 0 评论 -
UVa 1617 笔记本(Laptop)
题意:有n条长度为1的线段,确认他们的起点,使得第i条线段在ri 和 di之间,输入保证 ri <= rj 当且仅当 di<=dj 保证有解,输出空隙数目的最小值。分析:既然有解。那就不有考虑怎么放了。只要看看放的时候让 cur++ 代表多放了一个多放了一个这样然后再看看是否 下一个的左端点大于cur 如果大于的话就令cur等于该端点。这个方法是可行的,本质上是贪心一个区间...原创 2019-11-17 13:19:05 · 578 阅读 · 0 评论 -
UVa 1616 商队抢劫者(Caravan Robbers)
题意:输入n条线段,把每条线段变成元线段的一条子线段,使得改变之后所有线段等长,且不相交。输出最大长度。例如有3条线段[2,6],[1,4],[8,12] 则最优方案变成 [3.5, 6] [1,3.5][8,10.5]输出 5 / 2分析:这道题数据有点坑,我用 1e-9作为数据精度过不了 1e-10才过了。思想是二分。还有小数转分数的0.0方法代码:#include<bi...原创 2019-11-17 12:47:12 · 222 阅读 · 0 评论 -
UVa 10570 外星人聚会(Meeting with Aliens)
题意:输入一个“1 - n的排列,每次可以脚环两个整数。用最少的交换次数把列变成1 - n的一个环状序列。看这个数据量就知道啦,算法可以很暴力。于是我就很暴力分析:暴力暴力暴力,左一下右一下。#include<bits/stdc++.h>#define LL long long#define INF 0X7fffffff#define ms(s) memset(s, 0...原创 2019-11-16 22:54:41 · 214 阅读 · 0 评论 -
UVa 1153 顾客是上帝(Keep the Customer Satisfied)
题意:有n个工作,已知每个工作需要的时间q和截止时间d,最多能完成多少个工作?工作只能一个一个完成,起始时间从0开始。分析:以d排序,优先队列。可以保证永远都是符合条件的时间小的在优先队列中。代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using ...原创 2019-11-16 18:08:27 · 194 阅读 · 0 评论 -
UVa 1615 高速公路(Highway)
题意:给定一个平面上n个点和一个值D,要求在x轴上选出尽量少的点,使得对于每一个点,都有一个选出的点离他的欧几里得距离不超过D。分析:实际上这道题可以转换为区间问题根据n个点的高度和所在位置,可以确认这个点需要的x轴的点的取值范围。然后根据贪心算法,按r排序,然后尽量选择区间的右边。代码:#include<bits/stdc++.h>#define LL long lo...原创 2019-11-16 17:07:00 · 234 阅读 · 0 评论 -
UVa 1613 奇怪的股市(Hell on the Markets)
题意:输入一个长度为n的序列a,要求确定每个数的正负号,使得所有数的总和为0,例如 a ={1, 2, 3, 4} 则设4个数的符号分别是 1, -1, -1, 1 即可。但如果 a ={1, 2, 3, 3} 则无解。分析:从大到小,因为可以确认的是,只有可能小的堆起来干一个大的才可能为0 ,总之这个算法。就是感觉是这样的啊。尽量中和,但是不能从小到大中和,这样最大的咋中和?证明留给读...原创 2019-11-16 16:12:38 · 151 阅读 · 0 评论 -
UVa 1613 k度图的着色(K-Graph Oddity)
题意:输入一个n个节点m条边的连通图,n保证为奇数。设k为最小的奇数,使得每个点的度数不超过k,你的任务是把图中的结点涂上颜色1~k,使得相邻节点的颜色不同。多解任意输出,输入保证有解。分析:这题听莫名其妙的,问的k是度,但是度和着色是没有关系的(这里可以求指正,本人认为没关系),例如 可以从1放出4条线,这个时候按图中的意思就是k = 5了 可是只需要1是2 其余放出射线的终点均为1即可。...原创 2019-11-16 15:31:28 · 353 阅读 · 0 评论 -
UVa 1612 猜名次(Guess)
题意:有n位选手参加编程比赛。比赛有三道题目,每个选手的每道题目都有一个评测之前的预得分,这个分数跟选手的提交程序的时间有关,提交的越早,预得分越大。接下来是系统测试,如果某道题目未通过测试,则为0分,否则得分等于预得分,得分相同的选手,ID小的排在前面。问是否能给出所有的3n得分满足最后的实际名次,如果可能的话,输出最后一名的最高可能得分。每个预得分均为小于1000的非负整数,最多保留两位小...原创 2019-11-16 13:39:15 · 248 阅读 · 0 评论 -
UVa 11925 生成子序列(Generating Permutation)
题意:给一个序列,例如 2 3 4 1 要求从这个序列的最小字典序的序列,生成给定序列。分析:注意题目不要弄反了,紫书有点误导倾向,导致做了好久这道题反向好弄,故反推。例如 2 3 4 1方法2变成最尾的到最头。最后注意再次反向。代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s...原创 2019-11-15 20:44:37 · 270 阅读 · 0 评论 -
UVa 1611 起重机(Crane)
题意:输入一个1~n的排列,用不超过9^6的操作把它变成升序。每次操作都可以选一个长度为偶数的连续区间,交换前一半和后一半。思路:俺们发现 例如按这个测试样例5 4 6 3 2 1我们要先把1移到第一个位置,然后就不管了,注意到1移到第一个位置后,不必再去动无论如何,第一步将1移到中间偏左的位置=> 3 2 1 5 4 6然后从 1需要移动到的位置延伸到1的距离为 3 - 1...原创 2019-11-15 16:33:24 · 253 阅读 · 0 评论 -
UVa 177 折纸痕(Paper Folding)
题意:你喜欢折纸吗?给你一张很大的纸,对折对折再对折……,每次对折都是从右往左折,因此在折了很多次之后,原先的大纸会变成一个窄窄的纸条。现在把这个纸条沿着着折纸的痕迹打开,每次都只打开“一半”,即把每个痕迹做成一个直角,那么从纸的一端沿着纸面平行方向看过去,会看到一个美妙的曲线。(建议自己折一下)绘出这个美妙的曲线。分析:可以发现实际上是一个递归的过程,比如只有四个折痕的时候假设为 a b...原创 2019-11-15 10:45:16 · 489 阅读 · 0 评论 -
UVa 11491 奖品的价值(Erasing and Winning)
题意:你是一个电视节目的获奖嘉宾。主持人在黑板上写出一个n位整数,邀请你删除其中的d个数字,剩下的整数便是你所得到的的奖品的价值。当然,你希望这个价值尽量大,分析:贪心,一旦发现比前面大,就吃掉。代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using...原创 2019-11-14 23:06:01 · 210 阅读 · 0 评论 -
UVa 12545 比特变化器(Bits Equalizer)
题意:输入两个等长(长度不超过100)的串S, 和T, 其中S包含字符0,1,? 但是T只包含0,1。你可以让?变成0,1 或者交换S中任意两个字符,每次操作都耗费一个操作度,求最小需要的操作度。分析:要判断可不可以变成另一个,只要看是否?全为0能不能使0大于T中的0,或者是否原先的0就大于T中的0了,也就是要保证 ZERO1 <= ZERO2 且 ZERO1 + ‘?’ => ...原创 2019-11-14 17:14:40 · 171 阅读 · 0 评论 -
UVa 1610 聚会游戏(Party Games)
题意:输入一个n个字符串的集合D,找一个长度最短的字符串(不一定在D中出现)S, 使得D中恰好一半串小于等于S,另一半串大于S,如果有多解,输出字典序最小的解。分析:vector 存,排序,取中间的两个,然后把第一个逐渐变大,例如 ABC -> AC -> B 这样,一次次检验和第二个的关系,一旦大于了就停止循环,要注意的是 如果是 AZC 按照算法会变成 A(Z+1) Z + ...原创 2019-11-14 16:50:41 · 187 阅读 · 0 评论 -
UVa 1149 装箱(Bin packing)
题意:给定N个物品的重量,背包的容量M,每个背包最多装两个物品。求至少要多少个背包才能装下所有的物品。分析:贪心,选择最轻的,然后选择他能够跟的最重的一起。如果一个都没有的话,那么就是全部都装在一个背包里。代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))...原创 2019-11-14 16:31:58 · 237 阅读 · 0 评论 -
UVa 12265 贩卖土地(Selling Land)
题意: 对于每个方格,寻找以这个方格为右下角的最大周长矩形。分析:一行一行找,维护一个单调递增的栈。看紫书的朋友们,其实,,这道题不看那个分析,自己想更快。代码;#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using namespace std;cons...原创 2019-11-13 18:38:57 · 306 阅读 · 0 评论 -
UVa 1442 洞穴(Cave)
题意:尽量在洞穴中储存尽量多的燃料,燃料不能碰到洞穴的顶部,但是可以无限接近,要求在洞穴中存储尽量多的燃料。分析:燃料会流,左右各一次,饮酒醉。代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using namespace std;const int ...原创 2019-11-12 21:14:38 · 208 阅读 · 0 评论 -
UVa 1609 不公平竞赛(Foul Play)
题意:n支队伍打淘汰赛,每轮都是两两配对,胜者进入下一轮。每支队伍的实力固定,并且已知每两支队伍间的比赛结果(不可能为平局,则一定有一方打败另一方),你喜欢一号队,但是一号队不一定是最强的,但是他可以直接打败其他队伍中的至少一半,并且对于每支一号队不能打败的队伍t,总是存在一支1号队能直接打败的队伍t’ 使得t’ 能直接打败t,输出比赛安排。先输出最底层的,比如n = 8 先输出 8场第一轮比...原创 2019-11-12 20:29:39 · 340 阅读 · 0 评论 -
UVa 1608 不无聊的序列(Non-boring sequences)
题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的,输入一个n个元素的序列A,判断他是不是无聊的。代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using namespace std;const LL maxn = 2...原创 2019-11-10 19:57:14 · 299 阅读 · 0 评论 -
UVa 12174 Shuffle的播放记录(Shuffle)
题意:你正在使用的音乐播放器有一个所谓的乱序功能,即随机打乱歌曲的播放顺序。假设一共有n首歌,则一开始会给这s首歌随机排序,全部播放完毕后再重新随机排序,继续播放,以此类推。注意,当s首歌播放完毕之前不会重新排序。这样,播放记录里的每s首歌都是1~s的一个排列。给出一个长度为n的播放记录,你的任务是同济下次随机排序所发生时间有多少种可能性。例如 s = 4, 播放记录是 3 4 4 1 3 ...原创 2019-11-10 19:54:26 · 234 阅读 · 0 评论 -
UVa 1607 与非门电路(Gates)
题意:可以用与非门来设计逻辑电路。每个NAND门有两个输入端,输出为两个输入端与非运算的结果。即输出0当且仅当两个输入都是1。给出一个由m个NAND组成的无环电路,电路的所有n个输入全部连接到一个相同的输入x,如图8-22所示。请把其中一些输入设置为常数,用最少的x完成相同功能。输出任意方案即可。二分查找或许是因为对称性,LRJ提出来了,在观察完000 - 111 这个过程的变化中,貌似可以...原创 2019-11-09 18:23:48 · 527 阅读 · 0 评论 -
UVa 11093 环形跑道(Just Finish it up)
题意:环形跑道上有n个加油站,编号为1-n。第i个加油站可以加油pi加仑。从加油站i开到下一站需要qi加仑汽油。你可以选择一个加油站作为起点,初始油箱为空,但是可以立即加油。你的任务是选择一个起点,使得可以走完一圈后回到起点,假定油箱中的油量没有上线。如果无解,输出 Not possible,否则输出可以作为起点的最小加油站的编号分析:贪心。试想 如果从你可以从1走到p 但是从1 - p ...原创 2019-11-09 15:26:27 · 301 阅读 · 0 评论 -
UVa 12627 奇怪的气球膨胀(Erratic Expansion)
题意:一开始有一个红气球,每个小时候,一个红气球会变成3个红气球和一个蓝气球,而一个蓝气球会变成4个蓝气球。经过k小时候,第A~B行一共有多少红气球?分析:考虑f为前i行红气球总数 k表示小时,i表示行数当 i <= 2^(k-1) 时 值应该为 2 * f(k, i)i > 2^(k - 1) 时 值应该为 f(k, i - 2*(k - 1) ) + 2 * c(k - ...原创 2019-11-09 10:58:33 · 191 阅读 · 0 评论 -
UVa 10954 全部相加(Add All)
题意:有n个数的集合S, 每次可以从S中删除两个数,然后把他们的和放回集合,直到剩下下一个数。每次操作的开销等于删除的两个数之和,求最小总开销。所有数均小于1e5.分析:这不就是哈夫曼树的构建过程吗?代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))usi...原创 2019-11-09 10:13:42 · 210 阅读 · 4 评论 -
UVa 714 抄书(Copying Books)
题意:把一个包含m个正整数序列划分成k个非空子序列,使得每个正整数恰好属于一个序列。设第i个序列的各数子和为S(i) 你的任务是让所有的S(i)的最大值尽量小。分析:首先由于k不小,因此无法暴力枚举。考虑二分复杂度为logM M为所有m的和,加上需要枚举一下所有的数,判断这个数是大了还是小了,因此需要O(n)的时间 总的就是 O(nlogM)难点:二分不难,难的地方在于,这道题要求前面的...原创 2019-11-09 09:48:45 · 196 阅读 · 0 评论 -
UVa 1451 平均值(Average)
题意:求一个01字符串的大于L长度那块的平均值。要最大。#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using namespace std;const int maxn = 1e5 + 10;int sum[maxn];int p[maxn];doub...原创 2019-10-31 22:13:54 · 241 阅读 · 0 评论 -
UVa 1471 防线(Defense Lines)
题意:给一个长度为n的序列,你的任务是删除一个连续子序列,使得剩下序列中有一个长度最大的连续递增子序列。详细在代码里。g数组表示的是以i为后缀的最长上升序列的长度f数组表示的是以i为前缀的最长上升序列的长度维护的set在维护的过程中可以保证二元的 i < j && a[i] < a[j] && g[i] < g[j]代码:#incl...原创 2019-10-31 19:55:08 · 250 阅读 · 0 评论 -
UVa 11054 Gergovia 的酒交易(Wine trading in Gergovia)
题意:直线上有n个村庄,每个村庄要么买酒要么卖酒,第i个村庄对酒的需求为ai 其中 ai > 0 表示要买酒,反之卖酒。所有村庄的供需平衡,即所以的ai之和等于0。把k个单位的酒从一个村庄运到相邻的村庄需要k个单位的劳动力,计算最少需要多少劳动你可以满足所有村庄的㤹。输出保证在64位带符号整数的范围内审题:很明显的等价转换问题考虑最左边的村庄,不管他要买酒和卖酒,酒一定从右边的村庄...原创 2019-10-29 17:03:45 · 145 阅读 · 0 评论 -
UVa 11134 传说中的车(Fabled Rooks)
题意:你的任务是在 n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内。用四个整数xl,yl,xr,yr 描述矩形,其中前两个点是矩形左上角坐标,后两个点是矩形后两个点坐标,则第i个车的位置(x, y) 必须满足 xl <= x <= xr , yl <= y <= yr 如果无解,输出 “IMPOSSIBLE ” (注意这个imposs...原创 2019-10-29 16:50:57 · 270 阅读 · 0 评论 -
UVa 1152 和为0的4个值(4 Values Whose Sum is Zero)
题意:题意很明确了,要注意的是,这个集合,其实可以是有重复元素的代码:#include<bits/stdc++.h>#define LL long long#define ms(s) memset(s, 0, sizeof(s))using namespace std;int main() { // freopen("in.txt", "r", stdin)...原创 2019-10-28 23:46:31 · 194 阅读 · 0 评论