- 博客(30)
- 收藏
- 关注
原创 UVa 1608 Non-boring sequences (分治法)
题目链接: https://cn.vjudge.net/problem/UVA-1608解法:首先想到分治法,若一个序列是“non-boring”就要求,其中任何一个连续的子序列中至少得有一个只出现一次的元素。所以我们可以先找出一个只出现过一次的元素A[k],若找不到这样的A[k],直接输出“boring“就ok了,现在我们假设能够找到A[k],这样一来,我们就可以将问题划分一下,判断A[0]...
2018-05-26 16:46:14
325
原创 UVa 12627 Erratic Expansion 分治法
题目链接:https://cn.vjudge.net/problem/UVA-12627一开始只能想到O(n*k)的算法,就是傻傻的一行一行的算,结果可想而知,TLE了。看了紫书看到了O(k)的算法,觉得很值得借鉴,以后肯定有不少地方能用到,就记录一下。 具体思路就是我们只须统计前 i 行的红球数量即可,我们用 f(k, i) 表示k小时后,前 i 行的红球数量,这样一来我们的答案就是 ...
2018-05-23 08:33:29
203
原创 UVa 714 Copying Books (二分答案 + 贪心)
最大值最小化问题我们可以二分查找这个答案,初始化上界 R 为这个序列的和,下界为序列中的最大值。我们二分查找,即取L和R的中间值C,判断k个中序列最大的S(i)是否小于C(这个过程我们只需要将序列尽量往后划分即可),若小于C,则上界R就变为C,否则下界L就变为C+1,重复这个步骤直到L==R即可,这时的L(或R)就是我们要找的。由于输出的时候需要满足,S(1)尽量小,其次S(2)尽量小……...
2018-05-23 07:22:54
245
原创 UVa 1471 Defense Lines (解释紫书思路)
题目链接:https://cn.vjudge.net/problem/UVA-1471设序列L表示连续递增子序列; 则最长的L就可以分为两部分,一部分是以j结尾的序列,另一部分是以i为开头的序列 现在我们来设置f(i)表示以i为开头的最长L的长度,g(i)表示以i为结尾的最长L的长度。这样一来我们可以在O(n)的时间复杂度内求出所有的f(i)和g(i),则最长序列L的长度就是g(j) ...
2018-05-21 18:42:59
874
原创 UVA - 11134 Fabled Rooks(简单贪心)
题目链接:https://cn.vjudge.net/problem/UVA-11134这题和我之前做的多校上的一题十分像,就是一个贪心。具体可以先看看这篇bolg:https://blog.csdn.net/super_son/article/details/80330290这和多校那题很像,唯一不同就是多了一步分析,这里的行和列是无关的,所以我们可以把行和列分开来看,行进行一次贪心,列...
2018-05-15 23:21:15
162
原创 HDU - 5360 多校 H题 Hiking
题目链接:https://cn.vjudge.net/contest/226118#problem/H这个题就是贪心法的简单应用,我们定义cnt为目前去远足的人数,cnt从0开始枚举,将目前所有的满足L小于等于cnt的人加到一个优先队列中去,这个优先队列按照每个人的R从小到大排序,然后我们选出第一个符合R大于等于cnt的人加入到远足团中来,一直这样进行下去即可。#include <c...
2018-05-15 22:21:48
161
原创 Uva-1152 (Hash) 4 Values whose Sum is 0
题目链接:https://cn.vjudge.net/problem/UVA-1152题目解法有多种,这里只讨论使用hash表实现,下面给出两种使用hash表解决此题的代码: Hash写法一: AC:Time 890ms 先枚举A集合和B集合中元素的和,直接存入Hash表中,接下来枚举C集合和D集合中元素的和的相反数在Hash表中出现的次数,即可,具体在代码中解释。#include ...
2018-05-13 12:25:56
270
1
原创 Uva 120 Stacks of Flapjacks
题目链接:https://cn.vjudge.net/problem/UVA-120这一题就是一个简单的模拟选择排序,对于n个元素,每次选出当中最大的元素,然后首先将这个最大的元素换到堆顶上去(如果这个元素就在堆顶,就可以跳过此操作),然后再将其换到堆底上去(若目前最大的元素就在堆底,以上步骤都可忽略,直接进入下一步),此时的堆底第一个元素的位置已经确定不会变了,然后对剩下的n-1个元素进行同...
2018-05-12 21:08:13
95
原创 HDU - 4300 多校A题 Clairewd’s message
题目链接:https://cn.vjudge.net/contest/226030#problem/A题目首先给出译码本,译码本给出了26字母的映射 然后再给出一段,截获的文本y,这段文本y的组成是:完整的密文+一部分明文。 所以我们可以把这段文本按照译码本先译码成一个文本x,文本x的组成:完整的明文 + 一串字符 这样一来我们就可以看得出,这就是一个裸的扩展kmp算法:寻找y[i…n-1]与
2018-05-09 18:57:41
137
原创 HDU - 5353 多校 A题 Average
这题一开始就想麻烦了,实际上只需要按照下面的规则来考虑即可:若糖果不能被平分,则直接输出“NO”求出平均数,让每个人所拥有的糖果数减去这个平均数。接下来从第一个人开始,枚举其对第二个人进行的操作,即给第二个人1颗糖,或从第二个人处取一颗糖,或者什么也不做。这样一来第二个人只能对第三个人操作(因为前面的人已经进行操作了,所以不能再操作前面的人),而且操作是唯一的,操作完成之后必须保证第二个人糖
2018-05-03 23:37:02
126
原创 HDU - 5363 多校 K题 Key Set
这题应该说是思维题,一开始了很久都没有想出来,后来听别人一说,就明白了。 题目中说了对于集合n,其中的元素为 [ 1, 2, 3 … n ] 所以这个集合的非空子集个数就是 2^n - 1 所以接下来我们这么来想,我们把集合n中的 1 这个元素去掉,就还剩下n-1个元素,这n-1个元素可以组成非空集合的个数就是2^(n-1) - 1,这其中有和为偶数的也有和为奇数的,对于和为偶数的子集合,我们可
2018-05-02 22:07:24
153
原创 HDU - 4969 多校 J题 Just a Joke
这个题主要就是考察微积分,我认为主要的难点就是积分公式不记得了,orz……. 首先题目中说了,在跑的过程中 Guizeyanhua 和 Girl 还有 圆心 必须保持三点一线,所以我们可以知道要想三点一线,则Guizeyanhua 和 Girl的角速度必须相同,所以就会有下面的推导: 这样一来代码也就好写了:#include &lt;cstdio&gt;#include &lt;...
2018-05-02 20:55:50
225
原创 问题 D:白狼(字符串问题)
问题 D:白狼 这个题很特殊,就是寻找长度最小的非子串 乍一看没法写,所以在比赛中果断给放弃了,比完之后仔细一想,还是可以写的。 可以知道需要寻找的非子串只由2种字符组成,一种是’k’,另一种是’o’,所以我们就可以分别用二进制的’0’和’1’来表示,之所以用’0’表示’k’是因为题目中要求优先输出字典序小的一个。 通常来讲这个非子串不会太长,太长的话就真的没法解了(后面证实确实不会太长)。
2018-04-25 20:12:07
211
1
原创 FZU-2282 Wand
这题主要就是用错排公式 + 组合数学: 错排公式: D[n] = (n-1) * ( D[n-1] + D[n-2] ) 求组合数: 我们注意到n、m都比较大,所以我们在求C(n, m) = n!/((n-m)!*m!)时候,直接求的话会出现精度问题,所以我们可以通过求逆元来避免这个问题,同时我们又注意到MOD=1000000007,这是个素数,所以我们可以根据费马小定理直接算出逆元。详情见代...
2018-04-20 12:30:36
137
原创 UVa 10305 Ordering Tasks 拓扑排序
这里的拓扑排序是基于DFS的,关于拓扑排序,紫书上说的比较清楚了。下面直接看代码: 首先是main函数: 其中G数组用来保存变量之间的关系,即若G[n][m] == 1,说明 n < m 。否则就是 n >= m; 关于c数组的用法紫书上解释了,但是没有放到代码中的解释可能看起来会比较吃力,等用到了c我们再解释不迟。topo数组用来保存经过拓扑排序之后的数据。const int maxn = 1
2017-10-20 20:32:20
292
原创 UVa 816 Abbott's Revenge
紫书上说:本题非常重要,强烈建议读者搞懂所有细节,并能独立编写程序。 。只能来好好学一学此题的技巧咯。首先是定一个结构体:struct Node{ int r, c, dir; Node(int r=0, int c=0, int dir=0):r(r),c(c),dir(dir){}}; //每一个Node中都存储着 “位于(r,c),面向dir” 这样一个信息。由题意可知,
2017-10-19 14:48:22
269
1
原创 UVa 12657 Boxes in a Line解析代码
紫书上的链表部分是基于数组的,不同于数据结构书上使用基于指针的链表。这样一来代码读起来就会有点晦涩难懂。这题也不例外,这里主要是练习使用 双向链表 。先看看这两个数组:const int maxn = 100000 + 5;int n, left[maxn], right[maxn];left数组中保存着每个盒子的左边的盒子的编号,right也就是保存着每个盒子右边的盒子编号。然后看看这个link
2017-10-11 16:15:25
271
原创 UVa 1598 Exchange 翻译+解题
这个题目巨长,而紫书上的描述巨简单,但是看了题目的样例之后,心中mmp,这踏马什么玩意,怎么输出还能是这样。看了原题的输入输出细节之后,只想说,这哪跟哪啊,啥都看不懂。这下只能看原题了。(英语还没过四级,,因为还没考,,,,翻译的烂请谅解)第一段就不翻译了,因为没啥信息。这个有一个订货簿啊(后面就用本子代替了啊),它记录着一些订单,还有取消订单的记录啥的。这种没有被取消的订单被称为 act
2017-10-05 20:31:14
1106
2
原创 UVa 1596 Bug Hunt易错的地方
解决这个题我的方法有点麻烦,我用了两个映射表,一个是用来保存数组名,以及其长度。另一个是用来保存已经初始化的元素,及其值。但是这里我两个映射表中的元素都设置为string类型,为了好处理。//d保存定义的数组和其长度,f表示赋值的元素和其值map<string, string> d, f;现在我们来看看主函数:int main() { string buf; cin >> buf;
2017-10-02 20:13:02
286
原创 UVa 230 Borrowers
这个题我用了三个map表,就是下面三个(~orz,看起来有点多):typedef pair<string, string> PLL; //作者,书名map<PLL, int> s; //图书馆的所有书,value为0表示已借,为1表示未借map<string, string> d; //一个索引 d[书名] = 作者名map<PLL, int> re; //表示目前归还,还未上
2017-10-02 10:57:49
188
原创 UVa 1594 Ducci Sequence
这个题其实很简单,思路也很简单。但是我之前用的方法不对,其实可以直接使用一个map< vectot<int>, int> 这样的映射就可以解决。其中vector<int> 就用来存储这个n元组,每进行一次运算都要将结果存入map中,直到运算出来的全为0,或者是map表中之前就存在这个n元组。但是我之前不是这样写的,我是使用map<string, int> 这个映射,于是每次输入一个n元组,我就将其中
2017-10-01 16:28:31
307
原创 UVa 1593 Alignment of Code 细节
这个题目看起来很熟悉,没错,就是紫书上第5章的例题5-8 “Unix ls 命令”,这里的处理方式可以说和例题几乎一模一样。就简单讲一下我的思路吧。首先是是用一个vector<string> s[maxn] 来存储所有的数据,这就相当于一个二维string数组,我们将其存入之后,首先得找出每一列中字符串最长是多少,并且以其作为这一列的标准,这一列的所有其它元素必须通过在末尾添空格以达到和其一样长度。
2017-10-01 10:22:48
197
原创 UVa221 Urban Elevations 细述原理
先讲原理: 我们来个简单的模型(假设下面四个楼房一样高):现在我们来想想,如果我们从前向后看,能看到几个楼房?(楼房都一样高) 显然是3号、2号和4号。那么怎么让计算机解决这个问题呢? 我们判断建筑物是否可见,我们是不是可以枚举从 3号楼最左端到4号楼的最右端 所有的x坐标,看看该建筑物是否在x轴的某个范围内可见,这个在我们人脑中想一下就可以得出答案,但是计算机可不能这样处理问题,因为从 3号
2017-09-30 21:27:46
958
原创 UVa 1592 Database
其实紫书在第五章STL初步的时候介绍这个题,主要是为了演示STL的各种用法,但是效率会比较低。实践中一般会使用C字符串和哈希表来实现。我自己先写过一遍,就是先将数据一行行的读入一个string类型的数组中,然后设计一个函数,用来取指定行指定列的子串,然后主程序开始从第一列的第一行一直遍历到最后一行,中间每取出一个子串就将其保存到一个map映射表中,键为该子串,值为该子串所在的行数。若该子串在同一列出
2017-09-28 15:34:09
528
原创 一点一点解读紫书中例子--大整数类BigInteger (1)
首先贴上前一部分代码:struct BigInteger { static const int BASE = 100000000; static const int WIDTH = 8; vector<int> s; BigInteger(long long num = 0) { *this = num; } BigInteger operator = (lon
2017-09-27 10:11:55
1471
1
原创 UVa 213Message Decoding新手解法
总体来说我的解法和紫书的方法差不多。 1. 使用一个二维数组保存编码头,第一个下标表示每个编码头字符对应01串的长度,第二个下标表示01串的值,这样一来我们就可以得出此二维数组的大小,即code[8][1<<7] 这里我们没有使用code[0][n],这是为了方便操作。 2. 编写一个可以读取指定长度的01串并且返回对应的十进制的值。即下面的getNum() 函数。 3. 题目应该是
2017-09-26 16:29:28
278
原创 UVa 133 The Dole Queue 一些反思
就按照紫书上的解法来吧。#include<stdio.h>#define maxn 25int n, k, m, a[maxn];int go(int p, int d, int t) { while(t--) { do{ p = (p+d+n-1) % n + 1; } while(a[p] == 0); } return p;}int main() {
2017-09-26 06:39:08
262
原创 Uva 1339 Ancient Cipher 简单解读
我想应该会有些和我之前一样对紫书上这一题解法有疑惑的朋友吧,其实这些都是紫书上的一个例子给造成的,当时我把这题给略过了,但是当我看到第5章的stl中的map的时候,我突然又想起来这题,当初可能是我理解错题意了。下面来简单说一说我的理解,仅仅是我自己的理解,如果有不正确的地方,还请指出。 先介绍一下关联数组: 在计算机科学中,关联数组(英语:Associative Array),又称映射
2017-09-25 21:03:22
250
原创 UVa 1583 Digit Generator另一种解法
紫书上的解法:枚举100000内的所有正整数m的最小生成元,然后查表即可。之前一看到这个题目就想到了另一个方法: 由生成元的定义我们知道,对于一个数字y,如果y存在最小生成元,则其最小生成元x与y不会差太多,由题目中输入的例子也能看出: 216 对应 198, 121 对应 0, 2005 对应 1979,这些数相差不大, 仔细一想就能明白其中的道理,下面以y 为三位数为例子说下我的思路:
2017-09-25 14:22:53
208
原创 UVa1583 Digit Generator另一种解法
紫书上的解法:枚举100000内的所有正整数m的最小生成元,然后查表即可。之前一看到这个题目就想到了另一个方法: 由生成元的定义我们知道,对于一个数字y,如果y存在最小生成元,则其最小生成元x与y不会差太多,由题目中输入的例子也能看出: 216 对应 198, 121 对应 0, 2005 对应 1979,这些数相差不大, 仔细一想就能明白其中的道理,下面以y 为三位数为例子
2017-09-25 09:06:41
325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人