![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
蓝桥杯基础算法学习记录
日常算法学习~~
boomgloom
这个作者很懒,什么都没留下…
展开
-
AcWing 2060. 奶牛选美 最详细解释 DFS
给定两个顶点集合,在两个集合中各找一个点,求两个点之间的最短距离(这里的路线是只能横着走或者竖着走)首先我们要将所有点划分到两个集合中(两个斑点),可以用dfs遍历所有的邻接的点。其次计算最少点数,等价于遍历求两个集合点的最短距离,即为。注意这里的邻接只是上下左右,不包含斜线,所以我们的。注意本题求涂点数,要将曼哈顿距离减一。可以理解为只能选择两个方向前进。原创 2024-04-09 11:50:17 · 407 阅读 · 0 评论 -
AcWing 900. 整数划分 计数类DP
n分别看做n个物体的体积,这n个物体均无使用次数限制,问恰好能装满总体积为n的背包的总方案数(完全背包问题:dp求最大价值;本题:f是可能方案数)f[ i ][ j ]表示前i个整数(1,2…,i)恰好拼成j的方案数,可以分为取或者不取i,可以写成三重循环。初始化 f[i][0] = 1,体积为0自然不用装物品,也算一种方案。注意每次计算后对mod取模防止溢出。所以也可以写两层循环。原创 2024-04-07 00:15:00 · 216 阅读 · 0 评论 -
Acwing 803.区间合并
当只想读取 range 中元素时,使用 const auto&,如:for(const auto&x:range),它不会进行拷贝,也不会修改range;auto 即 for(auto x: range) 这样会拷贝一份 range 元素,而不会改变 range 中元素;当需要拷贝元素,但不可修改拷贝出来的值时,使用 for(const auto x:range),避免拷贝开销。当需要修改range中元素,用 for(auto& x: range);可以用这段代码输出数组检查,puts()原创 2024-04-05 09:39:07 · 526 阅读 · 0 评论 -
AcWing 799. 最长连续不重复子序列
显然[i-1,j]必然达到最大,所以每次重复会发生在新增添的a[i]上,j右移直到到达i。用数组记录每个元素出现的次数,遍历以。每次先把s[a[j]]--,再j++的[i,j]区间的最长长度。原创 2024-03-29 14:01:40 · 293 阅读 · 0 评论 -
AcWing 104. 货仓选址 c++
x-x1|+|x-x2|+……x取中位数(奇数个)或者中位数两个数之间(偶数个)包含这两个点。一维数轴上有n个定点,现在我们需要找一个位置使得其他点坐标与该点差的绝对值之和最小。显然可以用初中学过的绝对值不等式。原创 2024-03-24 11:18:58 · 140 阅读 · 1 评论 -
AcWing 913. 排队打水 排序不等式
(ti * 后面的人数);最小就是ti升序,后面的等待人数降序.最小序列不是t升序,则交换逆序的两个数,显然可以减少时间。已知每一个人的打水时间,求总共的等待时间最少。补充:贪心常用证明方法就是。也就是打水时间少的先打水。证明贪心策略的正确性。原创 2024-03-24 11:38:29 · 196 阅读 · 1 评论 -
AcWing 125. 耍杂技的牛
假设我们现在已经得到最优的排列,则选择第i头牛和第j头牛,交换他们两个必然会使结果(最大的不稳定度)变大。通过公式推导可以知道要满足这一个条件要用s+w升序贪心策略。证明:假设s[i]+w[i]=s[i+1]+w[i+1], 记w[1]到w[i]之和=k,根据假设,w[i]d1[i],所以结论得证。交换i和i+1:之前d1[i]=k-w[i]原创 2024-03-24 09:46:37 · 337 阅读 · 1 评论 -
AcWing 889. 满足条件的01序列 卡特兰数的应用 c++详解
可以转化为卡特兰数中经典的路线问题,从(0,0)到(n,n),且不可以经过y=x,看作有2n个位置,有n个1和n个0可以选择,要求前缀和中1个数多于0的个数。所以问题就转化为在取模条件下,这个数怎么计算。这显然属于第二类计算组合数的问题。原创 2024-03-23 12:53:34 · 267 阅读 · 0 评论 -
AcWing 888. 求组合数 IV 高精度乘法 阶乘质因数分解 线性筛 c++模板
这道题目可以分为三个步骤。原创 2024-03-23 11:43:07 · 210 阅读 · 0 评论 -
AcWing 885. 求组合数 I 模板题 c++详解
由c[i][j] = c[i-1][j] + c[i-1][j-1]可知,上两个元素可推出下面一个元素的值。方程:c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])所以我们只需要遍历二维表中右上部分,并且从上向下遍历填表。这道就是让我们计算组合数,结果对(1e9+7)取模。组合数天然的限制i >= j,并且已知。,画出二维动态规划表格(拙劣的画工~~)原创 2024-03-23 08:58:54 · 343 阅读 · 0 评论 -
AcWing 148. 合并果子(算法竞赛进阶指南)
类似构建哈夫曼树的过程,每次合并最少的两个数。因为越后合并的数被加和的次数越少(反证法可以证明)合并一组数,消耗量被定义为合并两数之和,将每次操作消耗量求和,求其最小值。原创 2024-03-24 11:53:45 · 131 阅读 · 1 评论 -
AcWing 100. 增减序列详解
我们可以用a[1]和a[n+1]但是他们不用==0所以是min(pos, neg)+abs|pos-neg|因为bi=ai-a(i-1)所以最后就是差分数组从2到n全部变为0,只剩下1和n+1。a区间的加减一可以变为差分数组b中两个元素left和right+1的加减1。选择bn+1好了,这时候我们每次的加减1可以包含进去b1也可以不包含。b[1]=a[1],也就是说最后所有元素都等于第一个元素。所以b1的取值有abs|pos-neg|+1种。原创 2024-03-25 21:49:30 · 373 阅读 · 0 评论 -
AcWing 4997. 更小的数
注意l--,r++有可能跳过l=r直接l>r所以不能用l!注意:数组越界、双指针交错,while循环的break。用二维数组存储了比较过的结果,用空间换时间。找到前面大于后面就反转,相等就向内部找。可见有时候调整一下暴力的思路就可以AC。但是三重循环TLE了~~原创 2024-03-24 23:04:26 · 90 阅读 · 0 评论 -
AcWing 907. 区间覆盖
每一段选择我们肯定要覆盖掉前一个区间的右端点,所以left[i+1]>right[i]在符合条件的区间里面选择新增覆盖范围最长的段(或者说右端点最远的)所以我们按照左端点升序排列,按照右端点枚举最远的区间。可以想象成我们有一段垃圾时间需要打发,手头上有n件事情,如何做最少的事情把这段时间消磨掉。经典的贪心问题,我们得到一个区间段,我们需要用n个区间段去覆盖他们。小心无解的情况,也就是可能有一段区间找不到覆盖的值,返回-1。内嵌函数重载运算符,l表示目前比较的数。注意结构体的赋值方式。原创 2024-03-24 14:58:36 · 249 阅读 · 0 评论 -
AcWing 102. 最佳牛围栏
最后乘以1000因为结果可能是小数,1000向下取整数就是精确到了小数点后面第四位。去掉题目的背景:有一组数,需要选择连续的至少Y个数字,让其平均值最大。这道题可以用二分法做,显然我们可以一步步逼近这个最大值,原创 2024-03-25 22:11:21 · 109 阅读 · 0 评论 -
AcWing 906. 区间分组
我们可以把所有开始时间和结束时间排序,遇到开始时间就把需要的教室加1,遇到结束时间就把需要的教室减1,在一系列需要的教室个数变化的过程中,峰值就是多同时进行的活动数,也是我们至少需要的教室数。依次遍历,如果当前区间能放到之前的某个集合中,则把该区间放到该集合。如果不能,则新开一个,把当前区间放到新开的集合中。类似于你需要考完n门考试,每一门考试只在每一天特定时间段举行,最少需要几天完成他们。类似于有n个活动,每个活动需要一间教室,最少需要多少间教室才能一天举行完所有活动。算法来解决:将区间按。原创 2024-03-24 15:19:51 · 244 阅读 · 0 评论 -
AcWing 90. 64位整数乘法
有2种方法,不能直接相乘,因为中间计算会因为数据过大错误(32次方量级)把一个乘数写成二进制,就类似于快速幂的思想。原创 2024-03-25 22:27:26 · 191 阅读 · 0 评论 -
蓝桥杯2023年第十四届省赛真题-平方差
显然所有的奇数和所有四的倍数满足条件,但是问题在于区间可能宽为1e9,所以不能用遍历。我们使用类似前缀和,也就是[i,j]=[1,j]-[1,i-1];求出(L,R)之间所有可以写出x=y^2-z^2的x。向上取整用整数除法,向下取整整数加一再去除。原创 2024-03-24 21:58:52 · 183 阅读 · 0 评论 -
AcWing 1248. 灵能传输 贪心法 详解
由(1)我们知道越单调越好,也就是说在每段区间中重复的曲线越少越好,所以曲线不可以扭来扭去太多次,至于先最小值再最大值可以画图看出重复处多于先大后小。由上述策略我们还是会有重复区间,在重复区间我们应当每次间隔一个数字取数,以保证相邻元素差值尽量小。但是我们的s[0] and s[n]无法改变位置,就像一根两头固定的松弛的绳子,分情况讨论。但是最后一个元素无法改变位置,为了便于操作,我们放进去s[0]=0,它也无法改变位置。我们应当a->d->b->c,假设c->d,则必然要走c->d->原创 2024-03-22 14:22:23 · 448 阅读 · 1 评论 -
AcWing 1265. 数星星 树状数组与前缀和 c++代码详解
考虑前缀和,记录每个位置前面有多少个比他小的星星,s[i] = s[i - 1] + 1;向树状数组中 插/删/改 一个元素,也可以用于线段树的初始化。只需要求出每一个x前面有几个小于它的,就是它的级数。因为y已经排好序了,所以二维问题就转化为一维。用差分数组,转化为单点修改和区间查询操作。求前缀和,查询和修改的时间复杂度均为。(即树状数组的好处是修改操作更快)求前缀和 或者 某一段子区间的和。拓展:树状数组还可以解决。原创 2024-03-22 18:26:08 · 415 阅读 · 1 评论 -
AcWing 798. 差分矩阵 c++详解
与核心操作的代码几乎一模一样,唯一的不同就在于把子矩阵大小从(x1,y1)到(x2,y2)变成了。若sum[]是a[]的前缀和数组,则a[]就是sum[]的差分数组。(一个元素),这样我们在输入原数组同时就实现了差分数组的初始化~要实现的就是二维差分数组最常见的操作——子矩阵每一个元素加C。给(x1,y1)到(x2,y2)的子矩阵所有元素加上C.。(这种思想在树状数组中也会用到),直接在其上进行差分操作,最后求。“差分”与“前缀和” 互为。二维差分数组的模板题 ~输入时将原数组转化成。原创 2024-03-22 15:38:40 · 375 阅读 · 1 评论 -
AcWing 99. 激光炸弹 C++题解 详解
数组大小的N是5005,点的下标实际上是0~5009,r = min(5001,r) 防止。搜索正方形范围最大是目标的最大的坐标,最小是(1,1)到(r , r);原创 2024-03-22 00:16:03 · 415 阅读 · 0 评论 -
AcWing 1227. 分巧克力 c++题解 二分法
取决于left与right初始取值:若right取不到,则右开。则最后[right,right)区间为空,所以终止循环条件就是 left = right。在 1 – 100000 之间找到一个最大的数a,使得所有的 (w[i]/a) * (h[i]/a) 之和大于 k。关键就是把检查过的mid踢出筛选序列,left可以取到,所以加一个,right取不到,所以写为相等。本题中不是比大小,而是借助Check函数,来判断是否符合。这道题目可以看作找最右(最大)边界的二分。找到 a 的最大取值即为答案。原创 2024-03-22 08:38:28 · 466 阅读 · 0 评论 -
AcWing 1230. K倍区间 C++满分题解
原题链接。原创 2024-03-21 22:27:40 · 312 阅读 · 0 评论 -
AcWing 1264. 动态求连续区间和 c++ 树状数组
来做这道题目,但是会比树状数组代码复杂许多。实现了单点修改和区间查询。原创 2024-03-22 18:51:19 · 330 阅读 · 1 评论 -
AcWing 876. 快速幂求逆元 c++
(要求,恒等号可以读作同余)因此当模数 p 为质数时,即为 b 的乘法逆元。b与模数 p 互质。原创 2024-03-23 08:46:51 · 654 阅读 · 0 评论 -
AcWing 797. 差分思想详解 C++
差分和前缀和互为逆运算,所以就是求a的前缀和数组,最后输出就是结果。一维差分数组的模板题,实现了对(l, r)区间的每一个元素加C。就是将区间修改的区间长度设置为1。结果输出,每个数字之间要加空格。原创 2024-03-22 17:06:02 · 171 阅读 · 1 评论