![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法竞赛入门经典
算法竞赛入门经典
王江奎
这个作者很懒,什么都没留下…
展开
-
UVA - 442:Matrix Chain Multiplication
题目链接:https://vjudge.net/problem/UVA-442题目分析题目的意思非常简单,就是给定一个矩阵乘法的表达式然后计算就可以了。随便写写AC代码#include <iostream>#include <deque>#include <vector>#include <string>#include <unordered_map>using namespace std;int ans;class M原创 2021-10-23 21:53:57 · 124 阅读 · 0 评论 -
UVA - 514:Rails
题目链接:https://vjudge.net/problem/UVA-514题目分析题目的意思是给一个栈输入一系列数据,在这个过程中可以出栈,看能否达到某个结果。刚开始我觉得这个情况好多,因此不是用模拟,而应该观察结果本身。对于结果中某个元素x,比他小的元素肯定已经入过栈了,此时可能有两种去处:已经在结果里面了还在栈里面对于1.,只能说它比x 小而且在x的前面,除此之外没有其他约束了。对于2.,那些比x小的元素在结果中的位置肯定在x的后面,而且肯定是逆序排列。因为只能进栈一次,而他们是从原创 2021-10-21 17:08:58 · 301 阅读 · 0 评论 -
UVA - 210:Concurrency Simulator
题目链接:https://vjudge.net/problem/UVA-210题目分析就是一道模拟题,但是细节有点多。写代码两个小时,调试代码用了两天。。。很长时间不刷题了,这道虽然算法简单但是细节满满的题目对我来说是一个很好的热身。尽量不要去使用匿名名字空间,发现对调试过程不怎么友好(陈硕大大说的对)。使用枚举类型对程序的可读性、可维护性的提升非常大重载输入输出运算符的时候一定要记得返回stream对象这种带有switch语句的,可以使用Stragety模式,这里没有使用,因为每条语句只有原创 2021-10-20 22:53:51 · 265 阅读 · 0 评论 -
UVa-12333:Revenge of Fibonacci 高精度
之前自己仿照紫书上写了高精度库,完善了乘法、减法,并且通过了和C++高精度库GMP的对拍测试,也一些OJ上过了一些高精度的模板题,代码仓库地址:https://github.com/Edward-Elric233/BigInt求解思路题目的意思是求前100000斐波那契数列中某个前缀(不超过40个字符)第一次出现的位置。刚开始我的想法很简单,先求出这十万个斐波那契数列的前缀,然后每次读入的时候查找一遍就可以了,结果超时了。每次查找的复杂度是O(1e5∗40)O(1e5 * 40)O(1e5∗40),有5原创 2021-08-08 21:14:59 · 139 阅读 · 0 评论 -
UVA - 1592:Database
题目的意思是找到两行在两列处相等,主要要做的是记录某个值是否重复出现过。经过思考,我的思路是:每一列用一个unordered_map<string,vector<int>>记录单词出现的行数,对于某一行中的两列,如果有两个元素在同一其他行出现了重复,则可以输出结果例如,第4行的第1个元素在1 3 5 6行都出现了重复,第4行的第2个元素在2 3行出现了重复,则r1 = 3; r2 = 4; c1 = 1; c2 =2;每一行用一个数据结构保存每一列在哪些行出现了重复,如果某一行原创 2021-06-27 17:42:43 · 140 阅读 · 0 评论 -
UVA - 400:Unix ls
题目的难点在于要求前面的每一列的是原创 2021-06-26 20:26:27 · 105 阅读 · 0 评论 -
UVA-136:Ugly Numbers
很简单的一道题,但是我竟然蠢到想不明白为什么如果从头生成会出现大量重复的数字。写的时候主要出现的错误在爆int上,一定要注意数据范围。#include <iostream>#include <queue>#include <set>using namespace std;using ll = long long;int main() { ios::sync_with_stdio(false); priority_queue<ll,原创 2021-06-22 15:09:51 · 118 阅读 · 0 评论 -
UVA - 540:Team Queue
主要的关键在于:不要试图让所有团队的人在一个队列里面,因为这样如果新入队的是一个前面团队的成员则必须先出队再入队。应该把每个团队看做一个整体,用一个队列维护团队的顺序,用t个队列维护每个团队内部的顺序。还有就是要维护成员编号到团队的映射关系,我这里用了一个一维数组,因为觉得1e6也不是很大。看到书里面用的map,觉得可以但是没必要。我还用了一个数组去维护每个团队是否有人站队。看书里面的代码才发现完全是多余的,我们可以通过每个团队自己的队列是不是空来判断。多组样例输入,应该把循环放在主函数里面,然后把原创 2021-06-22 12:23:45 · 172 阅读 · 0 评论 -
UVA - 12096:The SetStack Computer
题目描述很简单,难点在于如何对集合进行编码,因为是无限的,好像没有一个方向进行编码。紫书给的题解十分巧妙:给新出现的集合进行编码的确,我们没有必要为所有可能出现的集合编码后再开始,我们就可以简单的根据出现的次序分配一个映射值即可,这个值只要能够代表这个集合并且不发生碰撞。另一个巧妙的点是STL中的map竟然支持从对set的哈希,这个也太神奇了,虽然不明白是怎么做的,可能要看源码才能理解。代码如下:#include <iostream>#include <map>#inc原创 2021-06-22 10:58:00 · 133 阅读 · 0 评论 -
UVA - 101:The Blocks Problem
原本以为是一道很简单的模拟题,结果写了一个小时。。。很长时间不碰算法题,的确手感差很多。不过我觉得随着刷题慢慢多起来应该会好的。题目的意思也有点含糊,需要自己去猜,大概意思就是槽里有一堆木头,每个槽刚开始的时候只有一个,需要移过来移过去,有四种方式,这四种方式都是针对木头而言的,因此我们必须时刻记录每个木头的位置。当然还需要数据结构记录槽的状态,最后需要输出。四种移动方式有一些是共通的,因此需要将其抽象成函数,我这里抽象了三个函数:void ret_block(int x);将木头x头顶的木头归还原创 2021-06-20 16:46:08 · 142 阅读 · 0 评论 -
UVa1152
题意很好理解,就是从四个集合里面取出四个数字的和为0,问有多少种取法。直接枚举肯定是会超时的,所以得想办法优化一下。我们可以将两个集合的所有的和都放在一个数组里面,这样得到两个数组,然后排序,对第一个数组中的每一个数据在第二个数组中用lower_bound 和upper_bound查找计数。有了思路不是很难写,重要的还是这种将可能的结果映射在数组上然后进行二分的思想。书上说的是把其中两个集合的...原创 2019-09-26 23:37:49 · 265 阅读 · 0 评论 -
UVa11054
挺简单的小模拟。还是要注意思维的方向,要有切入点,不能像无头苍蝇一样东想一下西想一下,而应该分析问题的性质,然后尝试思维的方向,从不同的方向思考(顺序,逆序,排序后,建图,贪心,dp,搜索等等)时刻注意数据的范围,时刻提防爆long long ,不注意往往死的莫名其妙的#include<cstdio>#include<cstring>#include<cst...原创 2019-09-26 23:55:05 · 184 阅读 · 0 评论 -
UVa10375
题目描述很简单,就是求两个组合数的商.可是数字范围很大,肯定不能直接计算.因此要用到唯一分解定理,即将结果全部表示为素因子的幂的形式.#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<...原创 2019-09-28 13:58:09 · 151 阅读 · 0 评论 -
UVa10791
我们可以先用唯一分解定理将这个数字分解成素因子幂的乘积,为了得到最小的和,我们可以发现:每个 素因子的幂单独分开的和是最小的。先说明每个素因子都是以出现的最大的次数出现。因为最小公倍数一定,因此至少有一个数字的这个素因子的幂等于最大的次数,如果不一次取完,另一个和其他的因子的乘积肯定没有1和其他因子的乘积小。再说明每个素因子都是分开的:每个素因子的幂都是大于2的,都分开的话相当于每个素因子的幂...原创 2019-09-28 14:47:38 · 156 阅读 · 0 评论 -
UVa1635
我们很容易发现最后每一项的系数就是二项式展开,余数和m没有关系就意味着可以被m整除,因此我们就需要求出每一个二项式的系数。但是数据实在太大我们根据唯一分解定理将m和系数都进行分解,然后比较因子的幂。二项式的计算我们可以根据杨辉三角递推,可是这个实在是太大了,递推很慢。所以我们要知道二项式的另一个递推式:C(n,k)=C(n,k-1)*(n-k+1)/k,递推出需要的素数的分解式。我们发现判断...原创 2019-09-28 16:50:42 · 146 阅读 · 0 评论 -
UVa10820
实质上就是求欧拉函数值书上有个板子挺好,也不难理解。#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<queue>#include<set>using nam...原创 2019-09-28 17:15:38 · 120 阅读 · 0 评论 -
UVa1262
算是一个模拟吧#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<queue> #include<set>#include<vector>using...原创 2019-10-01 17:21:15 · 131 阅读 · 0 评论 -
UVa10491
氵#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<queue>#include<set>using namespace std;typedef long ...原创 2019-10-06 15:42:32 · 152 阅读 · 0 评论 -
UVa11181
题目要求条件概率,用贝叶斯公式我们很容易得到我们需要求r个人买东西的概率和每个人买东西的条件下其他r-1个人买东西的概率.我们递归枚举,每当枚举到r个人买东西的时候,我们加入到r个人买东西的概率中(全概率公式),然后对于这r个人,除去自己买东西的概率就是其他r-1个人买东西的概率(当然不是全部,加上就可以了).因此一遍枚举就可以了.记得不买东西也是有概率的#include<cstdio&...原创 2019-10-07 13:54:26 · 211 阅读 · 0 评论 -
UVa11572
书上把这种问题叫做滑动窗口问题.我的想法是先进行离散化,然后用一个数组记录元素出现的位置,如果判断某个元素已经出现,就将左端点移到上次出现的位置的后面.每次出现重复元素的时候判断一下答案.我觉得这样的复杂度是最低的.#include<cstdio>#include<cstring>#include<algorithm>#include<climi...原创 2019-10-07 15:53:59 · 146 阅读 · 0 评论 -
UVa1584
【题目描述】传送门【题目分析】也是一道简单的模拟题,1A嘿嘿嘿。再看书发现和书上的做法差不多。【AC代码】#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<cstdlib>...原创 2019-08-28 17:13:22 · 258 阅读 · 0 评论 -
UVa120
相当于是一个模拟,为了得到合适的顺序,我们的策略是每次找到当前没有被翻的里面最大的,然后把他翻到最前面,然后再翻到合适的位置。需要判断一下当前是否已经有序,有序就不用翻了。如果在最开头找到了合适的当前应该翻的应该不翻,因为最开头不需要。#include<cstdio>#include<cstring>#include<cstdlib>#include...原创 2019-09-26 22:40:11 · 270 阅读 · 0 评论 -
UVa1605
完完全全的构造题一种比较好想到(虽然我没有想到。。)的方法是做成一个两层的表格,第一层每一行相同,第二层每一列相同,这样每个都能和其他的相邻了。输出格式稍微注意一下#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<iostre...原创 2019-09-25 20:17:51 · 158 阅读 · 0 评论 -
UVa455
【题目描述】传送门【题目分析】就是一个简单的暴力,只是需要注意输出格式比较毒瘤。【AC代码】#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<iostream>#include<cmath>#incl...原创 2019-09-01 21:54:54 · 102 阅读 · 0 评论 -
UVa1225
【题目描述】传送门【题目分析】做题做多了慢慢都忘记暴力了,想要快速算出来,找到规律,但是找来找去好复杂的都没有找到,然后写了一个不能再暴力的写法,就过了。。。我还是觉得如果数据范围变成1e9那种级别的还是得要找到诀窍。有时间再找一下吧。【AC代码】#include<cstdio>#include<cstring>#include<cstdlib>...原创 2019-09-01 21:27:42 · 248 阅读 · 1 评论 -
UVa1586
【题目描述】传送门【题目分析】氵【AC代码】#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<cstdlib>#include<set>#include<...原创 2019-08-31 15:10:22 · 129 阅读 · 0 评论 -
UVa1585
【题目描述】传送门【题目分析】氵【AC代码】#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<cstdlib>#include<set>#include<...原创 2019-08-31 14:50:31 · 161 阅读 · 1 评论 -
UVa1583
【题目描述】传送门【题目分析】我以为很简单就写了一个暴力没有想到超时了。应该是T是非常大的所以必须得打表,将所有的结果都储存起来然后直接输出。以后遇到这种可以一下算出所有结果的多组数据最好还是算出所有的结果然后再输出答案。【AC代码】#include<cstdio>#include<cstring>#include<cmath>#include...原创 2019-08-28 16:57:36 · 138 阅读 · 0 评论 -
UVa340
【题目描述】传送门【题目分析】题目理解以后十分简单,但是这题面实在让人自闭,这么简单的题目啦啦啦啦说了那么多,实在是看不懂。(幸亏我看了书理解了题目的意思,要不然。。)还是要锻炼自己的读题能力。马达马达大内。【AC代码】#include<cstdio>#include<cstring>#include<cmath>#include<algo...原创 2019-08-28 16:36:52 · 113 阅读 · 0 评论 -
UVa401
【题目描述】传送门【题目描述】嘻嘻,自己做直接AC还是比较开心的。当然有一部分原因是之前看书的时候详细看过这个题的代码,但是这已经快一年了,应该说做出这道题凭借的是自己的能力吧。回过身去看了一下书中的代码发现自己写的不算复杂。就是一个简单的模拟。需要注意的是表里面没有给数字0对应的符号(不会出现),但是自己在根据是数字还是字符进行判断的时候需要按照自己定义的常量数组进行计算,比如我的把0对...原创 2019-08-28 15:46:09 · 229 阅读 · 0 评论 -
UVa10082
【题目描述】传送门【题目分析】同样是一道模拟,但是如何巧妙快速的解决仍然不简单。通过这道题告诉我们对于复杂确定的对应关系我们要灵活运用常量数组。同时还需要注意的一个小问题就是字符串数组中的"//"指的是转义后的单斜杠,如果只有一个的话就会变成/A,变成另一个没有见过的字符。【AC代码】#include<cstdio>#include<cstring>#inc...原创 2019-08-28 15:04:14 · 154 阅读 · 0 评论 -
UVa227
【题目描述】传送门【题目分析】题目的意思很简单,只是输入输出很毒瘤,我一开始用的fgets然后用scanf(" ")吃掉所有的空格和换行,可是这样有可能将迷宫的空格吃掉(例如这个空格恰好在第一行第一列)。然后改用getchar需要注意的是最后一个样例最后不能有换行,每两个样例输入之间可能有多余的换行,需要处理掉。【AC代码】#include<cstdio>#includ...原创 2019-09-03 21:49:06 · 239 阅读 · 0 评论 -
UVa232
[题目描述]传送门[题目分析]简单的模拟,注意细节[AC代码]#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<queue>#include<set>u...原创 2019-09-08 15:14:52 · 163 阅读 · 0 评论 -
UVa1368
[题目描述]传送门[题目分析]乍一看好像有点复杂,稍微思考一下只需要找到每个位置中最多的碱基.如果相等的话优先输出字典序小的.[AC代码]#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#inclu...原创 2019-09-08 15:47:15 · 203 阅读 · 0 评论 -
UVa12169
我们可以暴力枚举a,然后通过x1和x3确定b的值,然后确定其他的数字,一旦出现错误就放弃这组解。关键问题就在于如何通过a,x1,x3确定b的值x2=(x1a+b)%Mx3=(x2a+b)%M=((x1a+b)%Ma+b)%Mx3-kM=x1a%Ma%M+ba%M+b我们不妨设b<Mb(a+1)+kM=x3-x1a*a我们想要求出b,即就是求出这个二元一次方程的一组解,这时候用扩...原创 2019-09-25 17:01:54 · 229 阅读 · 0 评论 -
UVa11582
一个数学问题,一旦出现循环确定循环节以后就能解决问题啦.加上一个快速幂取模.需要注意的是数据范围是264,所以必须用unsigned long long才能解决问题.觉得板子还是要会自己写,否则不同的题目具体有一些小的改变就会束手无策.还有就是发现如果每次初始化数组的话就会超时,所以需要注意在不必要 的时候或者可以通过简单赋值的时候不要用memset进行初始化,挺耗时间.看其他人为了避免超...原创 2019-09-25 14:22:37 · 241 阅读 · 0 评论 -
UVa11134
【题目分析】觉得是一道挺考验贪心掌握程度的题目,我就算知道是要用贪心而且肯定和区间有关,肯定要进行一下排序什么的我还是没有找到合适的贪心策略。经过大佬的博客后我才明白如何进行贪心。如果没有任何提示看这道题,首先,我们要有将复杂问题分解的能力,即这里要发现两个维度之间是没有什么关系的,所以可以分开进行然后在一起输出结果。其次,我们要找到合适的贪心策略。正如大佬所说,贪心是问题导向的,我们不能...原创 2019-09-24 12:46:52 · 292 阅读 · 0 评论 -
UVa11809
【题目描述】传送门【题目分析】终于把这道题做完了,之前一直连题意都看不懂。实在不行上网找了一下大佬的博客,看懂题意后自己写,发现读入很难处理,就又学习了一下大佬的读入方法,用的是C++里面的sstream,很巧妙。主要就是一个打表。因为数据情况很少而且给定,所以打表就能解决。还需要注意用到两边取对数,因为阶码部分的位数很大,根本不可能存下。【AC代码】#include<cstd...原创 2019-09-16 22:00:41 · 367 阅读 · 0 评论 -
UVa1588
【题目描述】传送门【题目分析】刚开始想了一会没有想到什么很好的算法,看到了长度最多为100,就知道自己想的没有什么意义了,直接暴力,把每一种填法都试一下就知道了。适当剪枝一下(一个简单的乐观函数)【AC代码】#include<cstdio>#include<cstring>#include<cstdlib>#include<algorith...原创 2019-09-11 20:15:28 · 145 阅读 · 0 评论 -
UVa1587
【题目描述】传送门【题目分析】刚开始想简单了,认为只要相对的面相等就可以了。然后发现三个不同方向的面的边应该有相等的关系,即如果两个面公用一条边,那么这两个面的另外两条边就是另一个面的两条边。而且这三个量里面肯定有一个最小的,这个最小的边是每个面的较小值,因此只需要比较每个面的较小值,如果较小值相等再判断其他两条边,这样就可以省去很多不必要的比较。【AC代码】#include<cs...原创 2019-09-11 19:17:26 · 137 阅读 · 0 评论