2023牛客寒假算法基础集训营4 赛时思路+正解

今天的训练营全是图论题,实属遇到了自己不会的场了,只能凑合凑合打了,可能这把要上黄了,寒假算法基础训练营系列也有可能到此完结了。

今天的场我觉得应该是一个值得补题的一场,有很多题并不难但是比较典型的题目,自己的图论知识还是很菜,我写不了码量很大的题目,导致我图论一败涂地,前几场的图论题我很少出过,可能也是由于队伍也有图论比较好的选手的缘故,但是我觉得还是要加强自己的图论能力。

中文题面就不搞简要题意了

A 清楚姐姐学信息论
在这里插入图片描述
在这里插入图片描述
思路 首先这是一个比较经典的一个问题,可能接触过机组或者对计算机非常有了解的都可能会知道三进制机子的理念,三进制是我们最理想的进制,典故就来自于这个 x y x^y xy y x y^x yx的大小比较,所以有一定基础的可以快速秒掉这道题,思路就是3进制最优,2进制其次,剩下的越小越好。
代码

B 清楚姐姐学构造
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
思路 观察两个式子我们可以很容易地推出来 a i a_i ai, b i b_i bi的值, a i = ( c i + a_i = (c_i+ ai=(ci+ c n c_n cn − _- 1 _1 1 − _- i ) / 2 _i)/2 i)/2 b i = ( c i − b_i = (c_i- bi=(ci c n c_n cn − _- 1 _1 1 − _- i ) / 2 _i)/2 i)/2,然后剩下的维护2的逆元随便求即可,有一个比较好写的2的逆元 ( m + 1 ) / 2 (m + 1) / 2 (m+1)/2 ,需要注意的是m可能为2,此时2没法逆元,需要特判一下无解情况,即 ( c i + (c_i+ (ci+ c n c_n cn − _- 1 _1 1 − _- i ) _i) i)为奇数时无解。
代码

C 清楚姐姐学01背包(Easy Version)、D 清楚姐姐学01背包(Hard Version)
由于是一个问题两个版本就放一起讲了。
在这里插入图片描述
在这里插入图片描述
思路 C C C应该是一个比较典型的背包问题,大部分选手可以轻松 a c ac ac,着重讲一下 D D D,我们考虑该如何去实现少选某一件物品可以凑出的最大价值,我们可以发现我们可以维护前后缀背包去实现这个问题,维护前缀在不超过某容量能够放置的最大价值,和后缀在不超过某容量能够放置的最大价值,然后我们考虑最大容量下能够放置多大价值,考虑前缀分配 i i i容量后缀分配 j j j容量的最大价值,即以下这行代码就是我们要求的 n − 1 n - 1 n1物品能够组成的最大价值。

		int res = 0 ; 
		for(int j = 0 ; j <= m ; j ++)
			res = max(f[i - 1][j] + g[i + 1][m - j] , res) ;

然后判断是否满足在这里插入图片描述这个条件即可。
如果满足该若何求能够成为必选蝴蝶结的所需的最少价值,我们考虑把最大容量拿出 w i w_i wi给当前物品,那么剩下的 n − 1 n-1 n1个物品能够放置的最大物品的容量为 m − w i m - w_i mwi,然后用上述类似的方法维护即可。
代码

E 清楚姐姐打怪升级
在这里插入图片描述
思路 这是签到题,我们可以很容易地发现一个一个打死怪兽是最好的,然后就考虑每个怪兽打多少下即可,有个比较好写的写法就是我们先砍一刀,然后剩下的就是没砍死和恢复的过程,求数量的时候上取整即可。
代码

F 清楚姐姐学树状数组
在这里插入图片描述
思路 :赛时看到这个很吓人,但是你手推之后不难可以发现,我们树的形态一定是确定的,首先我们考虑当前节点是 u u u,左儿子一定是u - 2当前深度-1,右儿子一定为u + 2当前深度-1,深度为 u u u l o w b i t ( u ) lowbit(u) lowbit(u)所对应的位。
在这里插入图片描述
比如上图:我们可以发现观察8这个节点的左子树, l o w b i t ( 8 ) lowbit(8) lowbit(8)为8,8是 2 3 2^3 23,那么8的深度就为3,左儿子就为 8 − 2 2 8 - 2^2 822 = 4,再观察6这个节点的左右子树, l o w b i t ( 6 ) lowbit(6) lowbit(6)为2 , 2是 2 1 2^1 21,那么深度就为1,左儿子对应的节点为 6 − 2 0 = 5 6 - 2^0 = 5 620=5,右儿子为 6 + 2 0 = 7 6 + 2^0 = 7 6+20=7
其次还有比较重要的性质是左儿子 l e f t + 1 left + 1 left+1 u u u 之间的数一定在左儿子的右子树上, 1 到 l e f t − 1 1 到 left - 1 1left1的数在 l e f t left left的左子树上,右二子以此类推,这个性质对于遍历有重要作用。
接下来该如何判断前中后序遍历的第几个节点呢。
考虑 d f s dfs dfs递归:
1.中序 - 就是数字本身。
2.前序:
考虑从上到下去 d f s dfs dfs,然后考虑三种情况:
1.我们要找的节点 n n n u u u大,一定在 u u u的右子树上。
2.相等就是当前节点。
3.我们要找的节点 n n n u u u小,一定在 u u u的左子树上。
后序的遍历方式与此很像。
接下来考虑第一种情况,如果是前序遍历,肯定先遍历根,左子树再到右子树,所以我们把根和左子树的数量先加上去,是2当前深度+dfs到右子树的答案。
第二种情况 ,我们是前序遍历,所以遍历到当前节点就是我们要求的答案,遍历自己总共1次,返回1即可。
第三种情况 ,我们要遍历到左子树,我们要加上遍历到当前根节点的一次加上递归左子树的答案。
3.后序:
考虑从上到下去 d f s dfs dfs,然后考虑三种情况:
1.我们要找的节点 n n n u u u大,一定在 u u u的右子树上。
2.相等就是当前节点。
3.我们要找的节点 n n n u u u小,一定在 u u u的左子树上。
考虑第一种情况,因为是后序遍历,我们肯定要遍历左子树再遍历到右子树,所以我们加上左子树的数量,即2当前深度-1 +dfs到右子树的答案。
第二种情况,后序遍历我们要遍历完左右子树才能遍历根节点,所以我们返回左右子树的个数+1个根节点即2当前深度+1-1。
第三种情况,我们返回左子树的答案即可。
代码

G 清楚姐姐逛街(Easy Version)

在这里插入图片描述

思路 很裸的一道bfs,大部分选手都能写出来,即考虑暴力bfs智乃 c n t cnt cnt步能走的方块以及 q c j j qcjj qcjj c n t cnt cnt步走到了哪个方块,然后看看 q c j j qcjj qcjj c n t cnt cnt步能否到达智乃能走的范围内即可。
代码

J 清楚姐姐学排序
在这里插入图片描述
思路 这道题我做的非常烂,用了n3/32的暴力,等我补一下题解做法再给大家细讲,下面放我当时做的代码。
代码

L 清楚姐姐的三角形I
在这里插入图片描述
思路 : 小学数学题,小学学过的解法即先求 l a + l b + l c l_a + l_b + l_c la+lb+lc ( V a + V b + V c ) / 2 (V_a + V_b + V_c) / 2 (Va+Vb+Vc)/2,然后暴力一一相减即可。 l a = l a + l b + l c − V a l_a = l_a + l_b + l_c - V_a la=la+lb+lcVa ,以此类推,可以发现求出的三个数一定是唯一的,无解情况当且仅当这三个数能否组成三角形以及 V a + V b + V c V_a + V_b + V_c Va+Vb+Vc必须为偶数。
代码

M 清楚姐姐的三角形II
在这里插入图片描述
思路:考虑各种方式破坏 a + b > c a + b > c a+b>c的情况,样例给了一个很好的提示,可以考虑构造 a + b = = c a + b == c a+b==c的方式去构造,于是不难想到可以构造成 [ 1 , 1 , 2 , 1 , 1 , 2 , 1 , 1 ] [1 ,1, 2 ,1 ,1 ,2 ,1 ,1] [1,1,2,1,1,2,1,1]这样的数列。
代码

猜你喜欢

转载自blog.csdn.net/qq_52358098/article/details/128808277