竞赛讨论区 > 【题解】牛客小白月赛40
头像
213dd
编辑于 2021-11-11 12:25
+ 关注

【题解】牛客小白月赛40

出题人录讲题可能比较紧张,可能会有说漏,会有不完整的地方出漏洞的地方,希望大家多多包涵😂

A 数字游戏
这个题可以直接转二进制后模拟,二进制x中有偶数个1时,操作的是非前导零最高位,也就是说,在操作2中,我们需要关注的只有二进制x中1的位置,更简单粗暴地说,我们只需要知道二进制x中有多少个1就行,操作1则是一个奇偶变换,只涉及+1或者-1,因此,只要把x转二进制,从最高位开始对每个1进行处理,当此时有奇数个1时,当前这个1需要两步操作才能变成0,即最低位取反,再当前位置取反,当此时有偶数个1时,直接1次取反,此处要注意最低位初始为0和初始为1是在处理的时候是存在差别的

还有一种做法,是找规律,根据x里1的个数的奇偶性和x本身的奇偶性结合进行分类讨论,直接算出答案

B 跳跳跳

简单区间dp,只不过加上一个环处理

区间dp部分,f[i][j]表示当前走完的点中i为左端点,j为右端点时获得的最高分,确定了i,j之后,可以确定当前走完了j-i+1步,并且当前停留在i或者j这个位置,那么可以得到递推方程
f[i][j]=max(f[i-1][j]+a[i]*(j-i+1),f[i][j-1]+a[j]*(j-i+1)),因为要么走左边,要么走右边
循环是双重循环,第一层枚举走的步数
len=1 to n
第二层枚举左端点i
i=1 to n-len+1
此时可以确定右端点j=i+len-1,然后正常递推方程

由于这是个环,有一个比较常见的处理技巧就是开2倍数组,
最后枚举左端点
i=1 to n
ans=max(ans,f[i][i+n-1])

C 数字匹配

先预处理出1~n中对于每个数,其二进制形式中长度为k的子串有哪些,并转成十进制存储,此处是一个n2的存储,然后n2枚举所有数对,对于任意一个数对(x,y),我们需要判断是否匹配,可以直接枚举x中长度为k的子串所代表的的数字是否在y中出现过,若出现过则是匹配
这样处理的理论复杂度是n2log,并且,由于这个log特别小几乎可以忽略不计所以在实际运行中是跑的特别快的,如果写的比较优美,甚至可以两个log跑过去

D 优美字符串

签到题,相同字母中间插入就行,枚举一遍就可以算出答案

E 分组

最小化最大值,典型的二分答案+验证,验证人数最多的小组组数,验证的时候在人数没到上限的时候能组则组,如果组数>m,则不可行

F 过桥
简单dp

先考虑只有正数的情况,那很直接,对于每个点i,枚举步数j=1 to a[i],f[i+j]=min(f[i+j],f[i]+1),很显然,此时的答案是递增的,现在我们考虑负数对其中的影响,首先一段负数可能把路给截开了,直接导致路走不通,比如1 2 -1 -1 -1 -1 3,1和2所能到达的点都是负数,只能往回走,所以永远不可能抵达n,那么,负数是否会使答案更优呢,答案是不会,因为没有负数时,越靠后步数越大,负数相当于加上一步往回走,不可能更新出更优的答案,所以负数的位置相当于无效位置,因此当a[i]为正数时,正常状态更新,当a[i]为负数时,直接跳过,最后如果n的位置没被更新过,则是无法逃脱,否则,f[n]就是答案

G 空调遥控

|a[i]-K|≤p,把绝对值去掉,就变成 -pa[i]-K≤p,因此当p确定之后,满足条件的温度诉求的集合必然满足最大值与最小值之差不超过2p,所以只要把a数组sort一遍然后进行尺取即可

H 来点gcd
首先这题所有数据范围都是1e6以内的,这点需要注意
首先子集的gcd=x,那么这个子集里所有数都必然是x的倍数
反过来说如果子集里所有数都是x的倍数,那么这个子集gcd可能是x也可能是x的倍数
所以思路就有了,对于每次询问x,查询x,2x,3x……有无出现过,有就强行gcd,在这个过程中,如果gcd=x了,即可停止
那么问题来了,如果每次操作都要一直查询,会不会导致复杂度变大,
我们可以开个数组标记,如果已经询问过x了,直接输出对应答案,否则查询
这样对于每个x,都不会重复跑查询,那么他整个复杂度就是调和级数的复杂度,显然是可行的
还可以加一点奇怪的优化,比如最小的可行x应该是所有数取gcd,最大可行x是所有数当中最大值,不过加不加影响不是很大

I 体操队形

这个题的关键点在于数据范围
n≤10,算一下全排列n!=362800,这题的思路也就十分清晰了,直接跑一遍全排列一个个判断即可

全部评论

(8) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐