
AcWing算法学习日记
文章平均质量分 90
ChoSeitaku
是一名在校大学生,目前在做C语言、C++、蓝桥杯、算法、考研数学、408的内容,后期会做深度学习、机器学习、神经网络、人工智能、AIGC、WEB3、开发相关的内容
展开
-
【AcWing】蓝桥杯集训33考前重点|基础算法|图论|数论|DP|DFS等
最短路(SPFA、Dijikstra、Floyd)、最小生成树(kruskal)质数、约数、最大公约数、快速幂、组合数、矩阵乘法+快速幂。可以在AcWing题库用蓝桥杯和算法名词关键词搜索题目。DP、背包问题、序列模型、区间DP、状态压缩DP。DFS、BFS、深度优先遍历、宽度优先遍历。日期问题、进位制(负数的进位制)二分、前缀和、差分、双指针。原创 2024-04-12 22:40:10 · 507 阅读 · 2 评论 -
【AcWing】蓝桥杯集训每日一题Day32|贪心|1349.修理牛棚
一种可行的方案是,用一个木板将 3∼8 号牛棚的门挡住,一个木板将 14∼21 号牛棚的门挡住,一个木板将 25∼31 号牛棚的门挡住,一个木板将 40∼43 号牛棚的门挡住,这样一共遮挡了 25 个牛棚的门。请你计算确保购买的木板的总长度尽可能小的情况下,为了使所有住着牛的牛棚都用木板挡住门,最少要将多少牛棚的门用木板挡住。现在,给定可以购买的最大木板数量 M,牛棚的总数 S,牛的总数 C,以及 C 个住着牛的牛棚编号。挡住所有有牛的牛棚,总木板数量不超过M的情况下,要购买的木板的总长度是多少。原创 2024-04-12 22:03:47 · 1286 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day31|最短路|朴素Dijkstra算法|1375.奶牛回家(C++)
Z其实是终点,但是因为每条边是双向的,所以每个点到终点的路径反过来看,相当于把Z看成起点,到另外一个点的路径。接下来 P 行,每行包含两个字母以及一个整数,表示被一条道路连接的两个牧场的标记,以及这条道路的长度。现在你需要确定,哪一头奶牛能够最快到达牛棚,输出它最初所在的牧场的标记,并输出它走过的路径的长度。输出一个字母和一个整数,表示最快回到牛棚的牛最初所在的牧场的标记以及它走过的路径的长度。注意,同一字母大小写标记的两个牧场(例如,牧场 A 和牧场 a)是两个完全不同的牧场。原创 2024-04-12 19:54:22 · 1132 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day30|欧拉函数|3999.最大公约数(C++)
如果a+x的最大公约数等于a和m的最大公约数,等价于a’+x‘和m’是互质的。任意连续m‘个数,在模m的意义下,都和0~m’-1是同余的。x就会在0~m-1之间,并且a+x和m的最大公约数就是d。所有测试点满足,1≤T≤50,1≤a原创 2024-04-12 17:27:43 · 505 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day29|数学期望|DP|4009.收集卡牌(C++)
注意,本题在官网必须保留 10 位小数才能通过(可能是没加SPJ),在本网站无此问题,只要满足你给出的答案与标准答案的绝对误差不超过。因为n很小,只有16,表示有哪些卡牌的时候,可以用一个压缩的状态,用一个5位的01串来表示,01011,分别表示这5张卡牌有没有。对于 100% 的数据,保证 1≤n≤16,1≤k≤5,所有的 pi 满足 pi≥1/10000,且。,pn,用空格分隔。小林会一直抽卡,直至集齐了所有种类的卡牌为止,求她的期望抽卡次数。假设n=5,现在的卡牌有2,4,5,硬币的数量是2。原创 2024-04-12 16:40:47 · 938 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day28|组合计数|二项式定理|杨辉三角|211.计算系数(C++)
输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007 取模后的结果。共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。比如挑第一个元素,所有包含第一个元素的方法是一类,所有不包含第一个元素的方法是另一类。x的系数如果是k的话,说明有其中的k组取的是x这一项,剩下的n-k组取的是y这一项。如果包含第一个元素的话,就是要从剩下的a-1个元素中选b-1个元素。如果不包含第一个元素的话,就是从剩余的a-1个元素中选b个元素。这一项,对应的系数就是。原创 2024-04-12 13:39:45 · 917 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day27|矩阵乘法|快速幂|205.斐波那契(C++)
如果用C++实现矩阵乘法的话,需要存1x2的数组和2x2的数组,还需要写两个函数,比较麻烦。但是这个式子不适合这道题,需要做高精度,而且还要把n项精确求出来,没办法求余数。怕溢出,求第n项模10000的结果,这样就不需要写高i精度。乘以一个2x2的矩阵,就可以得到一个新的1x2的矩阵。把1x2的矩阵扩充一下,下面加两个0,结果还是不变的。求矩阵的n次方,可以类似用整数的快速幂来求。新的1x2的矩阵就是每一项往后递推,把矩阵第一个元素的下标当作矩阵的下标。放到一个矩阵中,是一个1x2的矩阵。原创 2024-04-12 12:59:51 · 920 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day26|分解质因数|试除法|3377.约数的个数(C++)
它不可能包括这k个质因子以外的质因子,如果包含的话就不能整除a了。共 n 行,按顺序每行输出一个给定整数的约数的个数。输入 n 个整数,依次输出每个数的约数的个数。只要不超过,就一定是可以整除的,是一个约数。如果想求选法个数的话,可以用乘法原理。包含的质因子只能从这k个质因子中选。可以用分解质因式的方式来求约数个数。d的不同就取决于每个质因子的次数。分别计算每个整数的约数的个数。用试除法的话,时间复杂度是。求约数个数是有一个公式的。每个质因子次数+1 相乘。每个质因子是完全独立的。把a的因式分解求出来。原创 2024-04-11 23:07:21 · 897 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day25|最大公约数|算数基本定理|4199.公约数(C++)
如果x可以整除a,并且x可以整除b的话,那么x就一定可以整除a和b的最大公约数。任取一个既是a的约数也是b的约数的数,一定要证明出来是a和b的最大公约数的约数。任取一个a和b的最大公约数的约数,一定既能整除a也能整除b,所以属于左边。如果一个数是a和b的最大公约数的约数,这个数就既是a的约数也是b的约数。a和b的最大公约数里的任何一个约数,都一定既是a的约数也是b的约数。要证明一件事,x所有可以选择的集合,就是a和b的最大公约数的约数。那么x一定是a和b的最大公约数的约数。原创 2024-04-11 22:16:44 · 985 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day24|快速幂|504.转圈游戏(C++)
游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,…,依此类推,第 n−m 号位置上的小伙伴走到第 0 号位置,第 n−m+1 号位置上的小伙伴走到第 1 号位置,…,第 n−1 号位置上的小伙伴顺时针走到第 m−1 号位置。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,…当走到第n-1个位置的时候,再往下走一步就到了0的位置,所以最终的位置编号再mod一个n。轮的话,一共会顺时针走。类似于倍增和反复平方法。原创 2024-04-11 21:18:55 · 1072 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day23|树形DP|字典序最小3465.病毒溯源(C++)
在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。保证了变异的方式是一颗树,不会发生交叉变异和循环变异,一定是从父节点向子节点变异。一开始是一个病毒,有可能会变异成多个不同的病毒,变异的病毒还可能变异成新的病毒。如果有多个方案的话,输出字典序最小的方案。原创 2024-04-11 20:49:05 · 877 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day22|区间DP|博弈论|1388.游戏(C++)
区间DP一般第一维循环,先去枚举长度,长度长的一定是依赖长度短的,因此按照长度从小到大枚举每个区间,就一定可以保证在算每个状态的时候它所依赖的状态都算出来了。每次有多种选择,每次选完之后,一定要让最坏情况下最好,也就是我们选完之后,对方一定会选择对他来说最好的情况。方案可能不唯一,分值是一样的,每个人都希望分值最高,都绝顶聪明,最终每个人的分值是唯一确定的。就是看选左边的话,差值A-B的最大值是多少,选右边的话,差值的最大值又是多少。每一次有两种选择,是选左边的还是右边的呢,左边的就是。原创 2024-04-10 23:38:27 · 1020 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day21|背包问题|完全背包|DP|1371.货币系统(C++)
从1到i中选,且总金额是j的所有方案的集合,并且第i种货币选0个,等价于从1~i-1中选,总价值是j。现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。接下来的若干行,将一共输入 V 个整数,每个整数表示一种货币的面值。从1到i中选,总钱数是j,并且第i种货币用了1张,的所有方案的集合。划分的时候一般是找最后一个不同点,也就是第i种货币用的数量。不同的货币,面值可能是相同的也可能是不同的。V种货币,每种货币的使用次数是不限的。不同种类的货币,面值可能是相同的。原创 2024-04-10 22:42:18 · 1027 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day20|线性DP|312.乌龟棋(C++)
乌龟棋中共有 M 张爬行卡片,分成 4 种不同的类型(M 张卡片中不一定包含所有 4 种类型的卡片),每种类型的卡片上分别标有 1、2、3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。1,2,3,4各使用A,B,C,D张的话,最后一张可以用1234中的任意一种,所以可以分成4大类,这样的方式可以将方案不重不漏的分为4类。前面变化的部分,所有1234分别使用A-1,B,C,D张的所有方案的集合,要从这个集合当中取一个最大值,根据状态描述,恰好就是。原创 2024-04-10 20:55:49 · 1117 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day19|状态压缩DP|常数优化|1<<n|731.毕业旅行问题(C++)
为了不失一般性,看其中某一个子集,比如第k个子集,要求第k个子集的最小值,关键是看第k个子集的含义是什么,就是先从0号点,走过中间的一些点之后,最后走到了第k个点,最后再从第k个点走一条边,走到第j个点,并且走完之后整个路线的走过的城市的集合的二进制表示是i。在枚举的时候,有些子集可能是不存在的,比如i是11010,j如果是2的话,可以发现i当中不包含j,遍历完所有的i当中的城市,是不可能处于j的,所以其中有很多状态其实是无效的,如果是无效状态的话,就不需要枚举去计算。原创 2024-04-10 19:25:26 · 783 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day18|树状数组|前缀和|1265.数星星(C++)
换句话说,给定 N 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。例如,上图中星星 5 是 3 级的(1,2,4 在它左下),星星 2,4 是 1 级的。N 行,每行一个整数,分别是 0 级,1 级,2 级,……例图中有 1 个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星。星星按y坐标增序给出,如果y相同,按x的增序给出,也就是一行一行给每个星星的坐标。一个星星的等级是这个星星左下方区域的星星的总个数,包括同一列和同一行的星星;原创 2024-04-10 16:52:55 · 780 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day17|单调队列|求直方图中最大矩形|单调栈|模型转化|1413.矩形牛棚(C++)
当枚举到其中一条边时,上下边界就确定了,接下来考虑左右边界,左边如果能延伸,就一直往左边延伸,知道延伸到左边第一个比当前的高度低的方块为止,有边界也是。因此只要对于每一个长条,预处理出来左边第一个比它矮的长条,和右边第一个比它矮的长条,就可以知道左右边界了,进而就可以知道矩形的宽度了。在此基础上枚举一下上边界,矩形的上边界一定会取直方图的上面的一条边,可以依次枚举一下到底取哪一个小长条的上面的边。高度预处理,每一列的高度都是独立的,所以可以按列预处理,通过递推的方法。如果被破坏的话,就是1;原创 2024-04-09 21:31:36 · 721 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day16|哈希|FloodFill算法|字典序最小|映射|1402.星空之夜(C++)
可以使用暴力的方式去找,可以把星群所有出现的坐标存到一个数组里,每一次拿到一个新的星群之后,判断一下它在存过的星群里面有没有出现过,一个一个去比一遍,出现过的话,就是同一类,没有出现过的话,就是一种全新的类,时间复杂度是。当前没有出现过的字母如果是a的话,是按照字符串的顺序一个一个枚举的,当前字母选a的话,一定比选大于a的字母的字典序更小。输出的时候,标记的方案有很多种,为了方便评测,规定输出一个字典序最小的方案,就是把每一行拼接起来,拼成一个字符串。整个图做一遍,包含1万个点,计算量是1万;原创 2024-04-09 19:55:47 · 1186 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day15|并查集|528.奶酪(C++)
只要两个球相交或者相切,就可以认为这两个球的空间是连通的,这个老鼠就可以互穿,如果这个球和上边界相切的话,就认为老鼠和上面的区域是连通的,如果洞和下边界相切,就可以认为老鼠可以通过这个洞和下面的区域连通。可以把每个球看作是图论中的一个点,如果两个球,它们是相交或相切的,就可以连条边,整个上边界可以看成一个点,整个下边界可以看成是一个点,有一块大奶酪,是一个三维问题,有上边界和下边界,左右两边是无限长的,下边界的坐标是z=0,上边界的坐标是z=h。原创 2024-04-09 16:46:03 · 918 阅读 · 2 评论 -
【AcWing】蓝桥杯集训每日一题Day14|Flood Fill|洪水灌溉算法|DFS|并查集|687.扫雷(C++)
如果你点击到的单元格内不含地雷,则单元格内将显示一个 0 到 8 之间的数字(包括 0 和 8),这对应于该单元格的所有相邻单元格中包含地雷的单元格的数量。只要在周围的八个方向上都是0的话,就可以建一条边,就可以用并查集合并到一个集合里,就可以用并查集维护出来所有0的连通块的数量。可以把扫雷中空白的格看作是洼地,周围的1是山峰,可以看成是在格子这块开始注水,注完之后会把所有的洼地填满。3. 剩余的1~8,周围有0的话,有可能点有可能不点,取决于点的顺序。原创 2024-04-08 22:50:31 · 1059 阅读 · 4 评论 -
【AcWing】蓝桥杯集训每日一题Day13|BFS|状态转移|1355.母亲的牛奶(C++)
点与点之间有多少条边,对于每一种状态,比如当前牛奶量是a,b,c,容量是A,B,C的话,每个状态要选择从一个到达另外一个,一共有6种转移方式,因此每个点最多向外延伸6条边。每一个状态都可以用一个三元组来表示,可以将所有的三位组看成是图中的点,如果一个状态可以转化为另一个状态的话,可以看成这两个点之间有一条有向边。把所有初始点能到的点都遍历出来,遍历完之后,枚举一下所有第一个数是0的所有状态,然后去判断一下第三个数所有可能的结果。比如A往B里倒的时候,不能超过A,并且小于等于B的容量减去现有的量。原创 2024-04-08 17:20:54 · 908 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day12|回溯|暴力搜索|剪枝|167.木棒(C++)
如果最后存在一个方案,可以把这个方案设出来,i就不能作为当前长木棍里面的木棍了,就只能作为其余木棍里面的木棍,由于i是当前第一根没有被用过的木棍,每一根长木棍内部的短木棍的编号都是递增的,所以i就必然在未来的某一根长木棍里面是第一根,如果把这两个方案交换一下,就可以构造出来一个当前第i根木棍作为当前长木棍第一根的一个方案,就矛盾了。假设把第i根木棍放到了当前的位置,刚好凑了一根长度为最终长度的长木棍,但是剩余的木棍是无解的,无法凑成长度为枚举最终长度的长木棍,它是无解的。原创 2024-04-02 23:46:04 · 1240 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day11|DFS|最短距离|曼哈顿距离|2060.奶牛选美(C++)
假设这条路径上有一些其他的块的话,点对的最短路径的起点就可以变更到路径上的其他的块的位置,距离会更短,就和之前的点对是最近的两个点矛盾了。可以看成是Dijkstra算法,因为队列当中只有两种值,在去搜索的时候,就不需要再用堆了,不用用优先队列了,可以用一个普通的双端队列来做。取距离最小值的这个点对,可以证明这条路径一定是存在的,中间一定不会有障碍物,中间一定不会经过其他的x。因此中间的这个路径上一定是没有其他障碍物的,这个路径是一定存在的,而且不存在更短的路径了。原创 2024-04-01 17:37:04 · 968 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day10|递归|暴力|数学归纳法|1360.有序分数(C++)
通过这样的方式,就可以将0~1之间所有的有理数全部遍历出来整棵树在遍历的时候每次输出分界点就可以了整棵树的中序遍历就可以有序地遍历0~1之间的所有的有理数原创 2024-04-01 14:14:59 · 1201 阅读 · 1 评论 -
【AcWing】蓝桥杯集训每日一题Day9|区间合并|1343.挤牛奶(C++)
从开始挤奶到挤奶完全结束,这一期间,至少存在一名农夫正在挤奶的连续时间段的长度最长为 900 秒(第 300 秒至第 1200 秒),完全没有任何农夫在挤奶的连续时间段的长度最长为 300 秒(第 1200 秒至第 1500 秒)给若干个区间,把所有区间合并一下,找一下合并之后区间的最大长度,和合并之后所有区间中间的最大空缺的长度。现在从 5 点开始按秒计时,第一名农夫在第 300 秒开始给牛挤奶,并在第 1000 秒停止挤奶。第二名农夫在第 700 秒开始给牛挤奶,并在第 1200 秒停止挤奶。原创 2024-03-30 19:22:00 · 956 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day8|日期问题|前缀和|3498.日期差值(C++)
如果按天来枚举的话,1万年,就是365万天,一共有100组数据,最坏情况下需要算3.65亿次,不一定不能过,因为这个题常数比较小,但是有超时的风险。如果按年来枚举,先统计一下前y-1年的天数,这样只需要大概枚举10000次,前y-1年很好枚举,一年一年枚举,平年就加365,闰年就加366。枚举完之后再看第y年,可以枚举一下第y年的前m-1月,最多枚举12次,算一下第y年某一月的天数累加起来。有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。的天数,中间剩下的就是。原创 2024-03-30 18:26:18 · 1006 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day7|贡献法|4261.孤独的照片(C++)
在枚举的时候,比如孤独的牛是G的话,要看它左边连续的H的数量,如果是H的话,看它左边连续G的数量,在从前往后推的时候,只要记录一下到目前为止,连续的G的数量跟连续的H的数量就可以了,要考虑的区间肯定要包含这头牛,这个区间的左端点一定要在这头牛的左边,右端点应该在这头牛的右边,如果这头牛是孤独的牛的话,那么它的左右边一定是与它相对的那些牛。可以发现,枚举完孤独的牛之后,只需要能够快速的预处理出来左边连续的跟它不一样的牛的数量,以及每头牛右边连续的跟它不一样的牛的数量,就可以用。原创 2024-03-30 16:35:24 · 1034 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day6|多路归并|贪心|1262.鱼塘钓鱼(C++)
对AcWing蓝桥杯集训第六天关于多路归并和贪心知识点的题目的题解,1262鱼塘钓鱼,其中包括知识点多路归并,使用C++语言,包括代码原创 2024-03-19 21:04:03 · 1316 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)
交换xy的话,它不影响y跟前面的数的关系,也不影响x跟后面的数的关系,所以只会影响x跟y的关系,所以只会对逆序对数产生1的影响,要么+1,要么-1。不管交换a还是交换b,如果交换a的话,相当于是把a的逆序对数+1或者-1,交换b的话,相当于是把b的逆序对数+1或者-1.可以,如果序列不是升序的话,必然存在一对相邻元素x,y,使得x大于y,交换这个相邻的逆序对就可以了,交换一次,k-1。比如交换x,y,每次交换xy之后对于逆序对的影响,如果逆序对数是k的话,只能让k+1或者-1,原创 2024-03-16 16:49:39 · 982 阅读 · 1 评论 -
【AcWing】蓝桥杯集训每日一题Day4|双指针|二分|3745.牛的学术圈(C++)
对AcWing蓝桥杯集训第四天关于双指针的知识点的题目的题解,3745牛的学术圈,其中包括知识点双指针和二分,使用C++语言,包括插图和代码原创 2024-03-13 20:50:53 · 908 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day3|差分|4262.空调(C++)
对AcWing蓝桥杯集训第三天关于差分的知识点的题目的题解,4262空调,其中包括知识点差分,使用C++语言,包括代码原创 2024-03-12 21:13:15 · 887 阅读 · 1 评论 -
【AcWing】蓝桥杯集训每日一题Day2|前缀和|562.壁画(C++)
对AcWing蓝桥杯集训第二天关于前缀和的知识点的题目的题解,562壁画,其中包括知识点前缀和,使用C++语言,包括插图和代码原创 2024-03-12 13:53:14 · 941 阅读 · 0 评论 -
【AcWing】蓝桥杯集训每日一题Day1|二分|差分|503.借教室(C++)
对AcWing蓝桥杯集训第一天关于二分的知识点的题目的题解,503借教室,其中包括知识点二分和差分和前缀和,使用C++语言,包括插图和代码原创 2024-03-09 19:28:41 · 1047 阅读 · 0 评论