- 博客(116)
- 收藏
- 关注
原创 算法做题记录
求f[a][b][c][d][e]时,可以假设将最后一个人放到第12345排,放到第一排时,需要保证a至少为1,且a-1>=b。如果X与Y是同类,那么将X挂到Y上,并且更新PX离PY的距离为 d[y] - d[x] ,即表示X与Y为同类。若果X可以吃Y,那么将X挂到Y上,并且更新PX离PY的距离为d[y] - d[x] + 1,表示X可以吃Y。思路:先计算数字A,B在n级城市的哪一块,再计算在n-1级城市的x,y坐标,递归综合得到A、B的坐标。,N,其中第 i 号战舰处于第 i 列。
2023-09-05 21:08:55
542
原创 D. Bracket Coloring
一种颜色填充:保证任意位置左括号数始终大于右括号数(整个字符串是一个合法括号序列) 或者 保证任意位置右括号数始终大于左括号数(将整个字符串翻转,是一个合法括号序列)如果是右括号,那么判断栈顶是否为左括号,如果是左括号,那么就与栈顶的左括号匹配,一起出栈;对于每一个位置,那么如果前面左括号多,那么将它放到无需翻转的子串中,否则,放到需要翻转的子串中。2.对于任意位置i,i前的左括号数一定大于等于右括号数(即右括号数不大于左括号数)首先判断整个字符串是否是一个合法的括号序列,如果他不是,输出-1;
2023-06-24 18:25:08
662
原创 Acwing346. 走廊泼水节
思路:对于每条边,有两个顶点u、v,分别属于两个集合(假设集合内部点已经完成全连接),那么将这两个集合连接起来,需要连接s[u]*s[v]-1条边(s[i]代表i所在集合 点的数量),且这些边的最小值为(u--v边权)w+1。倘若有其他方案或更优方案,那么在上述连接过程中,在连接集合u和集合v时,一定会有一条边小于w+1,那么在选取最小生成树时,选这条生成的边而不选初始的边也可以获得 最优/更优解,这与题意不符,因此可以确保取到最小。连接顺序:将所有边按照边权大小从小到大排序。2.为什么可以确保取到最小?
2023-06-19 09:46:24
518
原创 Acwing128. 编辑器
思路:分别用两个栈,记录光标左边的数和光标右边的数;用s记录前缀和,f记录最大前缀。对于前k个数的最大前缀,可能等于前k-1个数的最大前缀 或者 前k个数的和。即:f[k]=max(f[k-1],s[k])3.光标左移:将L栈的顶部元素push到R栈。4.光标右移:将R栈的顶部元素push到L栈。2.删除操作:删除L栈的顶部元素。1.插入操作:将x插入到L栈中。5.查询操作:输出f[k]
2023-06-19 09:21:13
588
原创 Acwing167. 木棒
1.拼的木棍条数越多,每条木棍的长度越短,且最多可以拼成n条木棍(即每根木条一样长)。3.如果拼当前木棍时,放入长度为fail的木条没有拼成功,那么就不要再对长度为fail的木棍进行搜索。2.如果当前搜索拼成木棍的条数已经超过期望的条数,return false;2.如果这条木棍拼好了,但剩余的木条无法拼成木棍,return false;同小猫过河,每次选一根短木条,放在前面没有拼好的木棍中,或者新开一条木棍。对所有木条遍历,先拼好一根木棍,再拼下一条木棍。4.对木条从大到小排序,先放长度大的木条。
2023-05-22 18:21:33
152
原创 Acwing166. 数独
每次填数时,先选取一个可选数字最少的位置填,这样可以为其他选择多的位置增加约束,以减少搜索次数。这里也是用一个二进制数来表示,有多少个数是可以选的,如果第i个位置为1,那么 i 可以被选。1.行约束、2.列约束、3.九宫格约束。
2023-05-22 18:10:12
104
原创 Acwing165. 小猫爬山
1、从1~cnt辆车中,选择一辆将它放进去不会超重的车放进去;1、如果当前开的车比最优解多了 return;2、将小猫从大到小排序,先放重量大的。2、新开一辆车将它放进去。
2023-05-22 18:02:40
105
原创 Acwing164. 可达性统计
思路:先对所有结点做一个拓扑排序,入度为0的结点(即最靠后)肯定只能到达自己,因此从后向前遍历,每个结点可以到达的结点就是他自己+他的后继可以到达的结点,这里用一个二进制数f表示一个点可以到达哪些结点,第i位为1代表可以到达第i个结点。所以只需将所有后继结点的f值异或起来,就可以得到该结点可以到达哪些结点。标签:拓扑排序+位运算。
2023-05-22 17:59:53
84
原创 天梯赛 L2-043 龙龙送外卖
假设龙龙每次送完外卖都回到原点,即他走的路程就是 每个点到已经访问过得点的距离*2 的总和。最后一次可以不返回原点,因此最终减掉一个离原点最大的距离。dfs : 返回x点到已访问过结点的最短距离。dfs2 : 返回x点到原点的距离。
2023-04-13 15:39:02
574
1
原创 天梯赛 L2-011 玩转二叉树
首先要明确建树过程,先序遍历的第一个结点一定是根节点,在中序遍历中找到这个结点,那么他的左边就是他的左子树,右边就是他的右子树,只要找到子树的范围,就可以递归调用。其次,要明确他的翻转过程,其实就是求出层序遍历后,将他每层倒着输出,所以总着来说就知识一个已知先序中序遍历,求层序遍历的问题。这里用tr[i] 保存每个位置上的结点的值,如果为0,则表示该位置为空。这个代码为了理清思路,很多地方写的有些亢余。
2023-04-11 09:04:14
236
原创 天梯赛 L2-002 链表去重
当遇到重复元素时,将这个结点插入l2,并且l1中最后一个结点的next值应被修改为当前结点的next值(因为这个结点被删了),l2最后一个结点的next值为当前结点的address。思路:用静态链表存储,从头到尾遍历一遍链表。当遇到不重复的元素时,将这个结点插入l1;2.printf格式化输出。1.要判断l2是否为空。
2023-03-23 17:36:38
174
原创 101. 最高的牛
注意点:有数据点有重复相望的牛,如果对重复的数据都进行操作的话,就会导致他俩中间的牛最大高度会被多减去一个1,因此在操作前要先判重。当得到一组牛可以相望时,可以将他俩中间的牛的高度都减去1,这样就可以保证他俩可以相望。可以先假设,所有牛都一样高。利用差分数组可以很好计算。
2023-02-21 22:47:18
257
1
原创 100. 增减序列
最终数组的方案数可以这样理解,前几次操作要尽量挑选一对bi(一个为正,一个为负),剩下多于的(可能为正,可能为负),可以将多于的与b1配对操作一次,也可以不与b1配对自成一组操作一次,所以,b1可能被操作的次数为0~abs(pos-neg) (多于数的和)现在的目标为将 b2 ~ bn 都变为0 , 每次操作可以任选两个数 ,一个数 + 1 ,另一个数 -1;将所有小于0的bi 转化为0 的最小操作次数为他们的和的相反数。因此将所有大于0的bi 转化为0 的最小操作次数为他们的和。
2023-02-21 22:44:05
101
原创 95. 费解的开关
思路:先学习黑白迭代游戏玩法,先枚举按第一行的所有情况,然后当上一行有没有点亮的灯时,一定要按这个灯正下方的灯;反之,如果这行的某个灯正上方的灯已经点亮,那么一定不能按这个灯,否则上面的灯就会熄灭,且在以后的操作中无法再次被点亮。因此枚举第一行turn的所有情况,然后模拟后四行,判断最终有没有将所有灯都点亮,若点亮,则判断是否需要更新最小次数;
2023-02-21 22:19:15
97
原创 P8756 [蓝桥杯 2021 省 AB2] 国际象棋
从1~m行遍历,首先先遍历第i行的前两行的状态 a b,判断 a b 是否冲突,若冲突,则continue;否则,计算第i行放置的棋子个数t,f[i][b][c][j]+=f[i-1][a][b][j-t];(即i-2行状态为a,i-1行状态为b,可以转移到第i行状态为c的情况)。设置 f[i][a][b][k] 数组 表示 第 i - 1 行状态为 a ,第 i 行状态为b 的方案数 , 最终方案数为所有。f[m][i][j][k]的和。
2023-02-20 19:42:04
186
原创 P8685 [蓝桥杯 2019 省 A] 外卖店优先级
每次处理订单消息时,先计算这天的前一天他的优先度,判断他是否出队,再加2得到这天的优先度,判断他是否入队。处理完所有订单后,计算所有店在 t 时刻的优先度,并判断他们是否在队列中。思路同领接表,开一个head数组存储上一次外卖店 i 接到订单的时间。
2023-02-20 08:48:09
332
原创 P8683 [蓝桥杯 2019 省 B] 后缀表达式
若减号多于负数个数,消去减号的方法: a - ( b - c - d ) (其中c,d为正数,b为负数)3.有减号时,且所有数都为负数,那么必须有一个数打头,仍是负值,其余数取绝对值。4.有减号时,且所有数中有正有负,那么选一个正数打头,即所有数都可以去绝对值。若a,b,c为负数,将其转化为正值方法:d - ( a + b + c )2.有减号时,且所有数都为正数,那么必须减去一个数,因此减去最小值。因此只要至少有一个减号,就可以把所有负数变为正数(全为负数时除外)1.当没有减号时,所有数都取正值;
2023-02-20 08:42:15
182
原创 P8669 [蓝桥杯 2018 省 B] 乘积最大
当k为奇数时,可以先选一个最大值,然后再两两选数。每次选一组(两个)数,两数乘积必为非负数。1.所有数都选,且数组中有奇数个负数。其余情况结果应一律为非负数,分析如下。2.所有数都是负数,且要选奇数个数。当k为偶数时,结果必为非负数;什么情况结果可能为负数。
2023-02-20 08:33:24
316
原创 Acwing 4655. 重新排序
思路:先读取区间,计算每个位置被统计的次数,让被统计次数多的位置填上尽可能大的数。重排后的和,即可将数组排序、统计次数排序 相乘求和可得。因此直接计算重排前的和,可以通过前缀和差分快速求得。
2023-02-14 22:08:21
150
原创 P8708 [蓝桥杯 2020 省 A1] 整数小拼接
然后,若a与e拼接的数(ae)比k小,那么ab、ac、ad都应该比k小(他们符合单调递增规律),因此只需找到a在前时,与最后一个与a结合小于k的数,这里可以用二分法提高效率。注意点:若找到最后一个与a结合小于k的数e,此时要注意减去aa这种情况,因为要选两个整数拼接,不可以选取同一个数。首先,要对数组a排序,并用len数组记录拼接后,若这个数放在后面,那么另一个数要乘的倍率。
2023-02-11 23:53:21
548
1
原创 P8755 [蓝桥杯 2021 省 AB2] 负载均衡
对每个任务进行处理时,先判断此时刻有没有算力释放,再判断是否有足够算力完成任务,若有,则减去相应算力,并记录该任务何时完成,会释放多少算力;思路:记录每个机器此时的算力,并开一个数组,记录该机器何时会释放多少算力。收获:v.erase() 会有返回值,返回要删除的下一个迭代器。
2023-02-11 23:37:48
240
原创 P8754 [蓝桥杯 2021 省 AB2] 完全平方数
思路:从1~n遍历n的因子,如果该质因子的幂为奇数,则因再乘以此质因数,才可以使n变为完全平方数。
2023-02-11 23:31:22
305
原创 P8753 [蓝桥杯 2021 省 AB2] 小平方
注意:小于 n/2 这个值可以有小数,因此先将n转化为浮点数再判断。同理,也可以先判断n的奇偶性,再分情况判断。
2023-02-11 23:21:51
260
原创 P8744 [蓝桥杯 2021 省 A] 左孩子右兄弟
思路:每个结点的最大深度 就为父节点的最大深度+父节点的子节点数用 f[N] 数组表示最大深度。
2023-02-10 22:14:48
103
原创 Acwing 3424. 最少砝码
n个砝码:1 、 3 、 9 、 ... 、3^n 可以表示1+3+9+...+3^n。3个砝码:1、3、9 可以表示 1 ~ 13。2个砝码:1、3 可以表示 1 2 3。1个砝码:1 可以表示1。
2023-02-09 20:49:58
70
原创 P8783 [蓝桥杯 2022 省 B] 统计子矩阵
若 [l , r] 不符合条件,那么[l , r + k ]一定不符合条件,进行l++再判断。若区间[l , r]符合条件,那么他的子区间也符合条件,符合的区间数为 r-l+1 个。先确定上下边界x,y,再确定左右边界l,r,在确定lr时,可以用双指针法。这样只需O(n)时间复杂度就可确定处lr边界。
2023-02-09 20:34:47
270
原创 P8613 [蓝桥杯 2014 省 B] 小朋友排队
思路:每个小朋友需要交换的次数=前面比他高的人数+后面比他矮的人数。用树状数组tr【i】记录身高小于i的人的个数。
2023-02-09 20:28:31
140
原创 P8686 [蓝桥杯 2019 省 A] 修改数组
如果f[i]==i,表示i还没有出现过,可以使用i,同时更新f[i]=Find(f[i+1])维护f【i】数组,代表读到数字i,i可以变成的第一个合法的数字。
2023-02-07 23:39:36
224
原创 P8663 [蓝桥杯 2018 省 A] 倍数问题
注意点:简单的三层循环顺序得到的不一定是和为最大值的情况如:10,9,8,7,110+8+7 是大于 10+9+1 的。
2023-02-07 23:33:41
369
原创 P8781 [蓝桥杯 2022 省 B] 修建灌木
最大间隔为修剪完这个灌木后向左修剪 或 修剪完这个灌木向右修剪 然后折回来。计算两次修剪同一灌木的最大间隔。
2023-02-06 22:39:31
243
原创 P8682 [蓝桥杯 2019 省 B] 等差数列
思路:先找到数列的最小值和最大值,每个元素与最小值的差值就为kd,那么公差就是这些差值的最小公因数,项数为(最大值-最小值)/ 公差 + 1。
2023-02-06 22:34:46
303
原创 P8742 [蓝桥杯 2021 省 AB] 砝码称重
注意点:由于每个重量的砝码只有一个,所以在处理一个砝码时只能更新一次,可以用二维数组表示f,记录上一层f的状态。2.若w > m ,那么 w-m 也可以被表示(将m放到物品栏,w放到砝码盘)3.若w < m,那么m-w 也可以被表示 (将m放到砝码盘,w放到物品盘)遍历所有可能的重量,若某重量w可以被表示,则分为一下几种情况。维护f数组,f[i]=true 代表 i 可以称出来。这里用队列记录需要更新的重量,当遍历结束后,统一更新。1.w+m也可以被表示(将w和m都放到砝码盘)当放一个重量为m的砝码。
2023-02-06 22:31:38
501
原创 P8635 [蓝桥杯 2016 省 AB] 四平方和
思路:将ab、cd分为两组,先遍历a,b,记录一个三元组(a,b,a*a+b*b);再遍历c,d,设t=n-a*a-b*b,那么现在就要找一个a*a+b*b=t的三元组注意点:如果a*a+b*b的三元组已经被创建,那么就无需再创建了(因为要保证字典序最小)
2023-02-06 22:18:47
278
空空如也
洛谷p6332 求指问题
2022-12-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人