紫书蓝书UVA
acm入门书籍-紫书,训练书籍-蓝书
部分题目
Joey丶sunk
古今成大事者 不惟有超世之才 亦必有坚忍不拔之志
展开
-
UVA - 10382 Watering Grass 贪心
题意明了 覆盖面的话 这里精度要求不是很细,可以求出每个圆能覆盖的左右边界 然后贪心选取,,规则就是左边界能覆盖的前提下 记录最大右边界, OK #include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<set>#include<stack>#include原创 2017-08-08 09:09:54 · 250 阅读 · 0 评论 -
UVA - 1513 Movie collection 树状数组
这个题要用到树状数组 如果没学过,可以看一下百度百科那张线性图表,还有这个人的博客也不错:http://blog.csdn.net/ljd4305/article/details/10101535如果会了树状数组那么这个题就很裸了 下面代码:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#i原创 2017-08-18 17:26:15 · 295 阅读 · 0 评论 -
UVA - 12083 Guardian of Decency 匈牙利算法(二分图最大匹配)
选人问题,符合某种规则的两个人不能在一起 最大匹配两个不能在一起的人,最后 所有人数减去 匹配数除以2 就是最大的带领人数#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <set>#include <stack>#include <queu原创 2017-08-21 13:40:53 · 419 阅读 · 0 评论 -
UVA - 1451 Average 单调队列 (数形结合-更新最大斜率)
找一段长度至少为L的区间 ,平均值最大 求前缀和,体现在坐标系中,就是 ( sum [ j ] - sum [ i - 1 ] ) ÷ ( j - i + 1 ) 包含 i 的 i - j 之间的斜率 只要单调队列维护斜率最大值就好了#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#inc原创 2017-08-21 14:30:59 · 342 阅读 · 0 评论 -
UVA - 10891 Game of Sum 区间DP(博弈DP)
用 dp[ i ] [ j ] 表示 i - j 区间内某个人能取的最大值 具体转移过程的理解见题解中#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<math.h>#include<set>#include<stack>#include<queue>#include<ctype原创 2017-08-14 15:50:05 · 253 阅读 · 0 评论 -
UVA - 10891 Game of Sum 区间DP(博弈DP)循环写法
跟上一篇博文一样,都是这个题,上一篇用递归的方式写的,这一篇用循环的方式求dp [ i ] [ j ] ——- i - j 区间的某个人最大的取值详解见上篇,理解区间与从左从右开始的子区间之间的关系就会这个题了#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<math.h>#includ原创 2017-08-14 16:36:47 · 252 阅读 · 0 评论 -
UVA - 1626 Brackets sequence DP
这个题可以看作:用DP求最少添加的括号数 那么这个题就比较短了,只有solve() 函数中的那一部分 dp [ i ] [ j ] 之间的转移就够了,, 本题另一部分就是打印解: 打印时会遇到4种情况,就是print()函数中3个if()和最后的 for循环,,分别理解下其正确性就好了#include <iostream>#include <cstdio>#include <cstdli原创 2017-08-15 10:03:56 · 263 阅读 · 0 评论 -
匈牙利算法 最大二分图匹配
#include #include #include #include #include #include #include #include #include #include #include #include // cout << " === " << endl;using namespace std;typedef long long ll;const原创 2017-08-22 08:21:45 · 241 阅读 · 0 评论 -
UVA - 10245 The Closest Pair Problem 直接暴力(数据很水)
正常应该是 分治的做法这里可以直接爆过#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0)// cout <<原创 2017-08-23 13:45:56 · 247 阅读 · 0 评论 -
UVA - 1328 Period KMP算法
KMP算法求循环节F 数组存的是前一个循环节的位置,只要判断前一个是不是一个循环节就好了#include #include #include #include using namespace std;const int maxn = 1000000 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;int n;char s[maxn];int f原创 2017-08-29 22:16:27 · 283 阅读 · 0 评论 -
UVALive - 7454 Parentheses 栈应用
用栈消去已经完美的括号,剩下的分两种情况处理就是了#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;cons原创 2017-10-28 18:18:09 · 199 阅读 · 0 评论 -
UVALive - 7456 Least Crucial Node ( dfs + set )
直接暴力求解,枚举每个点,dfs 求解对后面影响的点的个数#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll原创 2017-10-28 18:19:55 · 193 阅读 · 0 评论 -
UVALive - 7457 Discrete Logarithm Problem 费马小定理+暴力枚举+快速幂
由 费马小定理可知:a ^ b % m = a ^ ( b % (m-1) ) % m ;(费马小定理:m是质数时 a ^ (m-1) % m = 1)所以对于本题 枚举 a 的 1 - p 次幂对 p 取模,#include #include #include #include #include #include #include #include原创 2017-10-28 18:22:33 · 210 阅读 · 0 评论 -
UVALive - 7464 Robots 贪心+递归
递归处理: 把先把花费时间多的那种往花费时间少的那个上面传,如果传完了 就单独 分别往 base 传和自身传#include #include #include #include #include #include #include #include #include #include #include #include using namespace s原创 2017-10-28 18:31:07 · 258 阅读 · 0 评论 -
Corporative Network UVA - 1329 加权并查集(压缩路径优化)
比之上两篇博文,,这一篇是优化版 每次更新的时候 d [ i ] 表示 i 到根结点的距离,并且 f [ i ] 表示的不再是 i 的父节点,而是根结点,起到了压缩路径的目的 下次更新的时候更加快速#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#includ原创 2017-08-18 15:05:59 · 277 阅读 · 0 评论 -
Corporative Network UVA - 1329 加权并查集
可能是数据水点,,直接查找都不会错 f [ i ] 代表 i 的 父结点, d [ i ] 表示 i 到 父结点的距离,每次进行查找下篇博文 给出 压缩路径的做法,,耗时比较少,可应对更大数据量#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <原创 2017-08-18 15:02:14 · 194 阅读 · 0 评论 -
Corporative Network UVA - 1329 加权并查集
贴出来做反面教材 这个代码蠢得不行,,,处在超时的边缘(好多浪费时间的点)下篇博文还是这个题,会给出直接检索的代码 下下篇代码将给出压缩路径的代码,耗时极短,,,#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <set>#include <原创 2017-08-18 14:58:08 · 234 阅读 · 0 评论 -
UVA - 11039 Building designing 排序
按绝对值排序后,用 01 数组表示奇偶性, 相邻的几个0(或1) 只能算作一个(题意)#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<set>#include<stack>#include<algorithm>using namespace std;原创 2017-08-08 09:29:16 · 317 阅读 · 0 评论 -
UVALive - 2678 Subsequence 尺取法
尺取法 O(n)复杂度#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<set>#include<stack>#include<algorithm>using namespace std;typedef long long ll;typedef pa原创 2017-08-08 09:32:08 · 199 阅读 · 0 评论 -
UVA - 10970 Big Chocolate
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<set>#include<stack>#include<algorithm>using namespace std;typedef long long ll;typedef pair<ll, ll> P原创 2017-08-08 09:34:17 · 240 阅读 · 0 评论 -
UVA - 10340 All in All
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<set>#include<stack>#include<algorithm>using namespace std;typedef long long ll;typedef pair<ll, ll> P原创 2017-08-08 09:35:06 · 183 阅读 · 0 评论 -
UVA - 10795 A Different Task 递归
详细解释与推导见算法竞赛训练指南26页#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<set>#include<stack>#include<algorithm>using namespace std;typedef long long ll;typ原创 2017-08-08 09:37:02 · 220 阅读 · 0 评论 -
UVA - 108 Maximum Sum
求矩阵的最大子矩阵和 比较经典的问题了,,最原始的想法应该是枚举所有子矩阵,显然不行 然后我们可以想到 O(n) 的连续字段和 然后我们用 a [ i ] [ j ] 表示第 i 列 前 j 个数的和(前缀和的方法), 然后 枚举任意两行,用 b [ k ] 表示第 k 列 当前段的 和,再对 b [ ] 求最长连续字段和 #include<iostream>#include<cstdio原创 2017-08-08 11:25:17 · 296 阅读 · 0 评论 -
UVA - 11520 Fill the Square 水题
刚刚10分钟AC的水题 题目已经要求: 1.上下左右各不相同 2.保证解的字典序最小 因此可以想到整个矩阵中最多包含 A B C D E 四个字母, 所以从矩阵 左到右,上到下 枚举就好了 为了简便判断,我们让矩阵存在于 (1,1) - (n,n)之间 ok#include<iostream>#include<cstdio>#include<cstring>#includ原创 2017-08-09 10:16:38 · 224 阅读 · 0 评论 -
UVA - 11404 Palindromic Subsequence 动态规划(LCS)
看蓝书应该是可以转化为LCS的,但是我开始用 LCS 做的是错的,的确有些情况没考虑到,(自己的做法有问题,或许刘老师说的就是现在这个方法呢) 这里是用结构体 存一段回文串,包括他的长度 dp [ i ] [ j ] 表示i - j 的最长回文串 转移方程见题解循环内部 代码如下:#include<iostream>#include<cstdio>#include<cstring>#i原创 2017-08-09 10:25:25 · 268 阅读 · 0 评论 -
UVA - 10534 Wavio Sequence 波浪序列 { LIS - O(n*log n)}
乍一看不好下手 稍微一想就能想到 从左右两边分别求 LIS,可能数据量比较大,这里的用的 O(n*log n)的做法 还有题目已经要求了 上升下降的长度相等 所以就有 solve()函数中最后枚举每个点的时候,取最小的那个 代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include原创 2017-08-09 10:31:23 · 242 阅读 · 0 评论 -
UVA - 10635 Prince and Princess 转化为 LIS
首先每个序列的各个数字互不相同,可以给 a 串中的每个数字标一个编号(1 - n) 然后(把 b 中的每个数字也附上编号,)按照 a 中的数字所对应的编号,给 b 中每个数字附上相应的编号 这样 只需要求 b 编号序列的 最长上升子序列长度就好了 因为题中说了 第一个数字是1,b的第一个编号一定是1,所以不用担心 b 中出现而a 中没有的数字编号为0 会影响结果 代码如下:#include<原创 2017-08-09 10:40:04 · 189 阅读 · 0 评论 -
UVA - 11401 Triangle Counting 找规律 加法原理?
枚举三条边肯定不行,但是我们可以枚举三角形的某一条边,我觉得枚举最大的那条边不错 我开始是以最大边长 10, 11, 12,在纸上演示的,很显然的,如下: 10为最长边的时候的另外两条边: 2: 9; ————————– 1; 3: 9,8; ———————- 2; 4: 9,8,7; ——————– 3; 5: 9,8,7,6; —————— 4; 6: 9,8,7,原创 2017-08-09 11:28:14 · 239 阅读 · 0 评论 -
UVA - 11388 GCD LCM 很水的一到入门题
讲道理,学 c 语言的时候肯定学过 求 GCD 和 LCM, 一般是求出 a, b 的GCD后, LCM = a * b / GCD ; 这样就ok了, (LCM / GCD) = ( a / GCD ) * ( b / GCD ); 而且 ( a / GCD ) 和 ( b / GCD ) 互质** 额,,我在输入 G 和 L 是忘记判断合法性,错了,也就是 样例2,,,2333#incl原创 2017-08-09 15:29:40 · 401 阅读 · 0 评论 -
UVA - 10755 Garbage Heap 三维子矩阵最大和(压缩)
比较经典的路子了: 用 sum [ k ] [ i ] [ j ] 表示 第k层中 前 i 行 且 前 j 列 的所有数组和 这样类似数组前缀和,可以 在 O(1)的时间内求出 第 i 行 第 j 列 到 第 x 行 第 y 列的 中间部分的数组和, 然后 再用一维的 数组 g[ ] 存 每一层 当前选定部分的 和,就相当于求最大子数组和, 可以枚举每一层的选定部分#include <io原创 2017-08-17 21:18:47 · 241 阅读 · 0 评论 -
UVA - 11464 Even Parity 01矩阵——枚举
题意:给定 01 矩阵,问最少改变几个0成为1,使得每个数四周之和为偶数思路:首先想到枚举出所有满足题意的 01 矩阵,然后与原矩阵比较,然而不可实现,继续想到枚举边上的一行或者一列,就可以由此推出整个矩阵,然后我们对第一行进行 枚举,,这里选用二进制枚举,比较简便#include<iostream> #include<cstdio> #include<cstring> #include原创 2017-08-03 16:17:56 · 334 阅读 · 0 评论 -
UVA - 10457 Magic Car 枚举最小边+kruscal
题意:给定一个图,求两个城市之间 “某个值”最小,,这个值 是这条路径生最大边权减去最小边权思路:对于每次的两个点,枚举最小边,然后利用 kruscal 求最小生成树的方法,当两个给定点在一个集合的时候,说明已经连通这时候的新加的边就是最大边,此时枚举到的最小边就是最小边思考:这个题不难,但是我场上没能写出来,关键就是没能想到可以用枚举最小边的这个方式,加上 kru原创 2017-11-09 16:24:50 · 296 阅读 · 0 评论