自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 第十五届蓝桥杯总结

最后,经历了这四个月的学习之后,对我个人的提升还是蛮大的吧,至少计算机二级这种证书不用担心过不了了,哈哈哈,也算是以赛促学吧,要是不报蓝桥,自己也不会在算法这条路上走这么久,想起刚接触算法的时候一窍不通,现在能有所成就,也算是达到目标了,谨以此篇,记录我历时不长的算法经历!questionH(拔河):也是不理解为啥看到网上别人这题写的蛮麻烦,感觉数据范围也不大,我直接用前缀和预处理了之后,遍历整个数组,找一个k使得1~k的和与k+1~n的差距最小就行了,不知道题意理解错了没有。浅谈一下这次比赛题目。

2024-04-30 00:16:18 8247 16

原创 AcWing-滑动窗口

构建一个单调队列,并维护其单调性,即使队列里面的元素严格单调,(若为单调递增,且a[i]<=a[q.back()],则将队尾元素删除,反之若为单调递减,则当a[i]>=a[q.back()]时删除),依次将每个元素下标入队;双端队列与普通队列的不同处:双端队列删除元素时既可以删除队头又可以删掉队尾,其可以较好的维护单调队列的单调性;//判断队列是否为空,若为空则返回true,反之,返回false。//队头插入一个元素。//队尾插入一个元素。//返回下标为i的元素。

2024-04-12 19:14:09 423

原创 AcWing-矩形牛棚

首先想到的就是暴力做法,先用二维前缀和将每个矩形的和预处理出来,然后再依次枚举每个矩形的上下左右边界,判断每个矩形内的和是否为0(如果土地没被破坏则为0,被破坏赋成1),将所有矩形遍历完即可得到最大的矩形。sum[i][j](黑色矩形)=sum[i-1][j](蓝色矩形)+sum[i][j-1](红色矩形)-sum[i-1][j-1](橙色矩形);我们可以枚举下边界,然后将每一次看作求直方图中的最大矩形,如果没学过如何求直方图中的最大矩形,可以参考下这篇blog。

2024-04-12 15:14:21 629

原创 AcWing-直方图中最大的矩形

要求最大矩形,所以需要使矩形的高与长的乘积最大即可,依次从左到右将每一列当作中心列,向两边扩散,直到两边的高都小于该列的高,即为以该列为中心的最大矩形面积(中心不一定在整块矩形的正中间)若在遍历列的时候再去判断它前面或后面的列的高度是否小于它,则需要o(n2),显然数据范围过大,只能过一部分数据,我们考虑将每列的前方与后方的第一个小于它高度的列预处理出来(利用单调栈);还有h[st[tt]]>=h[i] 中的 '=' 因为要求比h [i] 小的元素,所以相等也满足;将h[0]=h[n+1]=-1;

2024-04-11 22:24:40 414

原创 蓝桥联系题-子串简写

将每一个与c2相同的字符前面与它相隔距离大于等于k的所有与c1相同的字符数加起来(我语文表达能力不太行,如果没看懂多看几遍应该可以理解)从前向后依次遍历当找到一个以字符c1开头的字符,有多少c2能与之组成合法的子字符串,然后累加起来;暴力做法(能过80%)

2024-04-11 13:34:38 326

原创 AcWing-松散子序列

解析:若不拿第i个,则前i个的最大值与前i-1的最大值一样,若拿第i个,又因为两个字符不能相邻,所以前i个的最大值等于前i-2个再加上第i位的值,然后两者中间取最大值;题目大概的意思就是有一个字符串然后每个字符串对应一个数字,如‘a'-1,’z'-26等等......然后在这一整个字符串内找出一些字符使他们的和最大,但是每两个字符之间不能相邻。典序的dp问题,与大盗阿福类似(悲,没报课,链接拿不上来)

2024-04-11 09:27:46 217

原创 Acwing-石子合并

考虑最后一次合并,一定是将两个已知的区间(区间合并的最优方案已被计算出来)合并,即只需将端点枚举一遍,判断哪个中间点可以将整个区间划分为两个小区间,使得两个区间合并的代价最小。首先将dp[1][j]初始化为0(即区间长度为1的任何区间的代价都为0);之后外层枚举每一个区间长度,内层枚举区间左端点,依次递推即可求出答案。

2024-04-04 22:35:54 283

原创 AcWing-游戏

若选择右边的数字,则,下一个人在i到j-1中选择对于他自己而言的最优解,所以,dp[i][j] 为w[j] +s[j-1]-s[i-1] (i到j-1的区间和) -dp[i][j-1](减去下一个人能拿的最大值)。同理,若取右边的数,则下一个人在区间i到j-1中取dp[i][j-1]表示该区间中的max(B-A),所以-dp[i][j-1]表示该区间中A-B的最大值,在加上w[j],表示区间i到j中A-B的最大值;最后dp[1][N]表示该区间内A-B的最大值,又因为A+B=sum(sum为所有元素和);

2024-04-04 22:08:28 668

原创 AcWing-孤独的照片

贡献法:由于区间数量过大,我们没办法枚举区间,换个角度思考,一张孤独的照片里面只能有一只同品种的牛,所以把旁边全是不同种类牛的牛的数量找出来就可以算出来所要求的区间数了,一头孤独的牛对应的区间数量res=sl [i] *sr [i] +max(0,sl [i]-1)+max(0,sr [i]-1);整体思路:首先想到暴力枚举所有区间,判断每个区间内是否有一种牛的数量是一只(提前用前缀和存放每个位置及以前的牛的数量)C++代码:(过不了)

2024-04-04 11:18:37 497

原创 今日学到的小知识点:

当用cin和scanf都不能满足要求的读入速度时,可以用getchar手写一个快读函数。将数组中第K小的数排出来,nth_element(数组名,数组名+K,数组大小);测试代码:(快读是上面的知识点)

2024-04-02 00:27:34 398

原创 AcWing-乌龟棋

首先我们将每种卡片的数量记录下来,状态转移时,必须要有此卡片才能进行转移,例:如果前面已经将A卡片用完了,后面就不能再使用A了;然后将dp[0][0][0][0]初始化为a[1],因为最初停在第一个位置,之后将所有状态遍历一遍,找出最大值,输出答案;由于走的方式有四种,所以dp[i][j][m][n]的来源有四种,状态转移方程式要求不重不漏,所以我们可以以使用的最后一个卡片上的数值来进行分类。

2024-04-01 00:13:06 404

原创 AcWing-木棍

与位于首位一样的思路,利用反证法,若最后一个无解,又因为木棍是按照顺序排列的,所以最后一根小木棍,必定放在下一根大木棍的首位,若该方案有解,则两种方案的第i跟木棍可以交换,所以与前提条件矛盾,无解;首先,将木棍的长度从所有小木棍的最大值开始遍历,遇到的第一个能使所有的小木棍组合成长度相等的大木棍时,则为最优答案,如果想暴力做的话(不考虑剪枝),会超时,所以需要用到剪枝。若某小木棍放在某位置无解,则与之长度相同的小木棍,也无解,思路同上,利用反证法推导出来矛盾,即可证明该命题不成立;

2024-03-30 20:20:36 637

原创 AcWing-毕业旅行问题

搞懂了Hamilton之后这题就很简单了,遍历一遍以[1,n]为结尾的所有节点加上a[i] [0],取最小值,遍历一遍后的ans即为答案;Hamilton最小路径的变种,如果Hamilton最小路径不懂可以看看我这篇文章。二进制状态压缩,dp。

2024-03-29 21:21:04 233

原创 AcWing—最短Hamilton路径

所以得出结论,只要确定最后一点的前一点的最短路径即为答案所求最短路径,因此dp的思路有了,但怎么表示走过的路径还是一个问题,今天刚学了一种方法:状态压缩,用一个数的二进制表示是否走过这个点(1表示走过,0表示没走过)second: 0–>1–>3–>2–>4 距离:18。fourth: 0–>2–>3–>1–>4 距离:20。first: 0–>1–>2–>3–>4 距离:21。third: 0–>2–>1–>3–>4 距离:17。fifth: 0–>3–>1–>2–>4 距离:19。

2024-03-29 20:57:33 338

原创 AcWing-动态求连续区间和

例:lowbit(6)=2;6的二进制表示为110,最后一位1为10,所以表示数字2,lowbit(7)=1,7的二进制表示为111,所以最低位1为1;树状数组的三个基本函数:lowbit(i):求某个数的最低一位1表示的数字;树状数组为分组管理,点与点之间有联系,并非像普通数组一样每个点之间相互独立。add(x,y)将x加上y,且表示的区间和也全随着x的变化而变化;因此树状数组比前缀和更适合做要进行多次修改元素的求区间和的操作;sum(x)求x之前的区间和,将数组里面所有x前面的数全加起来;

2024-03-29 00:23:03 255

原创 洛谷1803

因为要想尽可能的多参加比赛,所以越早结束比赛对后面留出来的时间就更多,可以参加更多场比赛,所以直接将每场比赛的结束时间按先后排个序,然后第一个比赛是比取的,之后遍历所有比赛,若该比赛的开始时间比前一场比赛结束的时间早,则跳过,判断下一场比赛,反之,把这场比赛加入,然后更新完结比赛的时间;用一个pair数组存放每个比赛的开始结束的时间,然后自定义排序规则:return a1.second < a2.second;本来还想用dfs bfs搜索来一点一点做的,看到了大佬的思路之后,直接orz了。

2024-03-26 20:32:50 580

原创 AcWing-扫雷

先遍历一遍地图,用一个数组存地图上每个点九宫格内有多少个炸弹,若碰到炸弹,则将炸弹标记(vis[i][j]=-1),然后将地图中vis为0的地方dfs,若其九宫格内还有vis为0的点,则继续dfs下去,直到九宫格内没有vis为0的点了,然后将res(存答案)+1;dfs(int i,int j):将地图中(i,j)的点标记,若该点附近没有炸弹,则将九宫格内整块区域全部标记,否则,直接返回;

2024-03-24 21:04:10 170

原创 AcWing-全球变暖

从整块地图起点开始找陆地,然后将与这块陆地连接的整块岛屿遍历并标记,并判断每个岛屿中是否存在四面都是陆地的陆地,若存在则将计数器加一,若不存在则继续找与这块陆地不相连的下一块陆地,直到遍历完整块地图。flood fill(求连通块),dfs,bfs。

2024-03-24 18:50:16 253

原创 蓝桥算法题-求解线性方程组

本题最大的坑点就是:题目所描述的x[i]又0和1构成,所以不少人可能会觉得x[i]为1101,101,10......这种二进制的数,若正确理解题意之后,这题还是蛮简单的;最后题目要求按字典序小的答案输出,那我们就先讨论x[1]=0的情况,若求不出1满足题意的解,则再求解x[1]=1时的方程组解,判断是否满足题意就看x[i]是否只为0或1;一是:当x[1]为0时,x[2]以及x[i]全部可以由x[i]=a[i-1]-x[i-1]-x[i-2]递推出来;二是:当x[1]为1时,思路同上;

2024-03-24 16:58:26 191 1

原创 蓝桥算法题-二进制王国

直接sort得到的答案应该是10100,但是答案应该是10010;所以直接sort的方法不行,要自定义排序,return s1+s2<s2+s1,才对。首先看到这个题目想到的是:直接排序,然后就直接寄了,为什么不能直接sort呢?举个例子:两个数10,100;

2024-03-24 16:12:02 301 1

原创 AcWing-母亲的牛奶

遍历每一种情况,将所有情况标记,最后从小到大依次遍历,判断某点是否被标记,若被标记,则表示可以到这种情况,直接输出,若没被标记,则继续遍历,直到遍历完所有c可能的取值范围[0,C](图的遍历)将每一种状态看作图中的每一个点,利用队列来实现图的遍历。

2024-03-24 15:44:03 380 1

原创 AcWing-空调

由于题目说明可以将连续一段区间的温度加或者减一个单位,很容易想到了用差分来做这道题,可以将理想温度与原有温度相减,然后在构造出相减之后的数组的差分数组,最终要使差分数组全部为0就行了(即使原有温度与理想温度的差值为0)最后将所有正数减去,(减一为操作一次),若为负数则加一;所需的操作步数:max(正数和,负数和的绝对值);

2024-03-24 15:22:10 349 1

原创 AcWing-冶炼金属(十四届蓝桥省赛)

按数学思维求出来每条冶炼记录的最大值与最小值,因为要满足所有记录,则要取之后取每条记录的最小值中的最大值,每条记录的最大值中的最小值,两者则为答案。A [i] /(B [i]+1)表示能取得的最小转化率的前一位,加一就表示能取得的最小转化率;假设每条记录中还差一个普通金属就可以合成下一个特殊金属了,则此时浪费率最大,转化率显然最小;假设将所有材料利用率达到最大,则用所有普通金属/特殊金属则为该记录能取得的最大转化率;

2024-03-23 00:17:46 366

原创 AcWing-管道

遍历一遍阀门,判断在mid时刻有多少阀门打开了,将打开的阀门所能充满水的管道记录下来,为了后面的区间合并,若此时没有阀门打开,则直接返回false;将数组按阀门所能覆盖区域的左边界排序(默认按pair第一个参数升序排列),判断下一个区域左边界能否与该区域的右边界连成一个完整区间,若不能,则直接返回false,若能,则用一个last记录该区间右边界,遍历完所有阀门后,判断last是否与len相等,(防止last超过范围:last=min(len,1LL*last);若此时res数组为空也直接返回false;

2024-03-22 23:55:18 568 1

原创 AcWing-分巧克力

由于巧克力最大边长范围为 [1,n],将此范围二分,在答案左边的数全部满足每个小朋友分得相同的巧克力,反之则不成立,构造一个Check函数判断每个mid是否合法;长度为X,宽度为Y的巧克力最多可以分成边长为mid的个数:(X/mid)*(Y/mid);将所有巧克力能分成的数量累加,若大于小朋友的数量则成立,反之不成立;最后注意二分的代码实现不要写成死循环!

2024-03-21 00:23:31 440 1

原创 AcWing—借教室

相反的,b [i] 的前缀和为a [i] ,即a [i] =a [i-1] +b [i];题目所求不能满足的第一个订单,可以转化为能满足的最后一个订单再加上一个,因此在所求的订单前面,全部满足所需的教室比提供的教室少,而在所求的订单后面,也全部满足所需的教室比提供的教室多,所有这个情况满足二段性,可以用二分来做;当a数组中的某一区间(s[i],t[i])中加上同一值d[i]后,b[s[i]]+=d[i],b[t[i]+1]-=d[i];所需知识:差分与二分。

2024-03-20 01:05:49 1151 1

原创 蓝桥练习题-摆动序列

当i为偶数的时候则反向遍历,也是利用了dp的无后效性,在dp[i][j]前面的j可以直接用,也不需要重新算一遍。当i为奇数的时候正向遍历,是利用了dp的无后效性,在dp[i][j]后面的j可以直接用,而不需要重新算一遍。最后将长度为m的dp[m][i]全部遍历一遍,加到所求答案方案数中,当然别忘记取模。初始化dp[1][i]为1,表示不管以什么结尾长度为一的方案数总是为一的。定义dp[l][i]为以i结尾长度为l的方案数。

2024-03-16 12:58:33 350 1

原创 蓝桥练习题-K倍区间

现在假设我们i等于7时,count [1] ==4,但是ans是先加了count [1]之后再加加的;也就是ans最后一次加的是3,把前面所有关于count [1]的全部加起来,1+2+3=6;对所有元素的前缀和取K的模,若s [i] ,s [j] 相同,则在j-1到i的区间内,区间和为K的倍数。以上就是这篇文章的全部内容了,希望对大家有所帮助!s[i]%K都要与前面的所有相同的s[i]%K构成一次区间,若前面没有与之相同的元素,则加0;首先,看到这个题,想到暴力求解,但显然,数据过大,暴力法过不了;

2024-03-14 21:23:57 482

原创 蓝桥练习题-反倍数

关于容斥定理的具体内容,可以参考这篇blog。暴力枚举(蓝桥数据太水了,能过)

2024-03-13 23:42:03 261

原创 N皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。dfs,按照一行到n行顺序放入,判断皇后在列的位置是否合法(写一个函数判断当前皇后所在位置的行和列还有两条对角线上是否存在其他的皇后,若不存在则合法),若不合法,找下个位置,若合法,dfs下一行,当达到终点时,结果加一。右上对角线:横竖坐标的和为一定值,例:4+1=5,3+2=5,2+3=5,1+4=5......右下对角线:横竖坐标的差为一定值,例:2-1=1,3-2=1,4-3=1,5-4=1......

2024-03-12 23:40:27 481 1

原创 蓝桥练习题-小朋友崇拜圈

dfs(x,st,res)x表示前一个小朋友崇拜的人,st表示崇拜圈的起点,res表示该圈当前已存在多少小朋友。遍历每个小朋友作为起点计算出以他为中心的环的大小,存入答案,并与下个小朋友构成的环比较,取两者中较大的值。希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!

2024-03-12 23:14:25 227 1

原创 蓝桥练习题-移动距离

对于奇数排和偶数排分别分类讨论,奇数排正常排列,偶数排则倒序排列。

2024-03-12 23:01:59 212 1

原创 蓝桥练习题-发现环

既然要找环,那必然有单独存在的电脑,即该电脑只与一台电脑相连,开一个vector<ll>rel[N]作为记录电脑之间的关系表,然后再开一个ListContact[N] 记录每个电脑分别与多少电脑相连,从起点出发,删掉ListContact[N]==1的点,然后循环,直到删完了所有ListContact[N]==1的点,剩余的点就是环中的一部分了,按顺序输出即可。tips:N一定要开大点,不然只能过部分,当时写的时候一直在纠结哪写错了,到最后发现数组开小了。

2024-03-12 14:51:29 227 1

原创 蓝桥练习题-分考场

暴力dfs,dfs(x,room) x为待放入教室的人,room为当前最大有几号教室,对x依次遍历教室1到教室room,若某教室当前没该同学认识的人,直接放入,接着放下一个人,若room个教室里都存在x认识的人,即x不能放入任何教室,则在开辟一块新教室放入该同学,dfs结束标志,当n个同学全部安排好后,最小教室号即为所求答案;其中,若当前教室号超过原有最小号,直接返回;希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!

2024-03-12 14:31:20 515 1

原创 蓝桥练习题-神秘符文的修复

当A数组中没有1时,B数组全为0;当A中有一个1时,B有两个1;当A有两个连着的1时,B中有两个1,有两个不相连的1时,B中有四个1,由此可见B中1的个数只能是偶数个。如果有大佬有更好的解法,欢迎大家到评论区分享自己的想法!(偶然想到的一个思路,不知道正解是咋样的)

2024-03-12 14:13:07 297 1

原创 蓝桥练习题—包子凑数

dp动态规划,因为蒸笼的数量是无限的,所以若第i个包子能凑出来,则第i-bucket[j]个包子也一定能凑出来,且0个包子一定能凑出来所以baozi [i] =baozi [i] ||baozi [i-bucket [j]];其中,若蒸笼中能装的包子数不互质(求最小公约数)则有无限多种可能凑不出来,如4,6,8凑不出所有基数。(也是从其他大佬那里学到的,不知道具体是什么原理,有没有了解的大佬在评论区说一下)

2024-03-12 14:00:41 288 1

原创 蓝桥练习题—kunkun的魔法阵

如果为 '(' or '[' or '{' 则进栈,否则出栈,出栈后与当前元素相匹配,若相同则继续,若不同直接返回输出,循环结束后还应当判断栈是否为空,若为空,则能成功,若不为空,则还有括号没匹配完,且没有元素能与之匹配了,则不能成功。学习栈的基础题,利用栈的特性,先进后出(FIFO)来实现;希望能帮助到有需要的的人,欢迎大家有问题到评论区一起讨论!

2024-03-12 01:10:04 257 1

原创 蓝桥练习题-密码脱落

要计算脱落的种子,换个思路,不妨计算还未脱落的种子,未脱落的种子则已配对,可利用最长公共子序列LCS(也是才学到的)来计算;

2024-03-12 00:55:54 131 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除