2021年-蓝桥c/c++ b组回忆题解

A

这个题有点坑人,因为他不是一个算法题,而是一个计算机知识题,不知道出题人出这个题的意图。。
刚拿到蒙了,但是回忆了一下,有次我手机限速,百度了一下1Mbps是多少。隐隐约约记得公式是1Mbps=0.125MB/s, 所以。。

B

利用素数筛打表,打到20210605,然后依次判定数字,以及每个数位是不是质数即可。注意这里不认为1是质数。

C

日期题,从2001.1.1枚举到2021.12.31,依次判断即可。

D

dp可解。 d p [ i ] dp[i] dp[i]为有 i i i个节点的二叉数的最小权值。则:
d p [ i ] = m i n 0 ≤ j ≤ i − 1 { 2 ∗ d p [ j ] + 3 ∗ d p [ i − j − 1 ] + j ∗ j ∗ ( i − j − 1 ) + 1 } dp[i]=min_{0\le j\le i-1}\{2*dp[j]+3*dp[i-j-1]+j*j*(i-j-1)+1\} dp[i]=min0ji1{ 2dp[j]+3dp[ij1]+jj(ij1)+1}

E

大小写转换不解释。

F

等差序列前缀和+二分,对于x,先二分出之前有多少轮。然后求和,然后加上最后不足的一轮的前缀和。

G

数位dp,令 d p [ i ] [ j ] [ f l a g ] dp[i][j][flag] dp[i][j][flag]为考虑前i位二进制,已经包含j个1,且已经到达上限flag=1,或没有到达上限flag=0的个数。

H

有循环节,我认为一个长度位n的01串会在最多迭代n次后陷入一个长度不长于n的循环节中,但赛后与别人讨论,也有说这个串在最开始就会陷入一个循环节中。都没有证明。不过我写的常数很大。估计没法拿到全分。

I

线段树+区间合并。我们视左括号为+1,右括号为-1,线段树要维护。1、区间和。2、从区间左端点开始求和的区间前缀和最小值和最大值。当进行区间反转时,进行以下操作:1、打标记。2、区间和乘-1。3、区间前缀和最小值和最大值交换,并乘-1。当进行查询时,从L节点开始,二分一个最长的,前缀和全是正数的区间。一般情况下,这个区间的右段端即位所求,因为如果这个区间是最长的,那么这个区间右段端的下一个位置的前缀和一定为负,则到这个右端点的前缀和一定是0。但是有例外,就是这个区间到序列的结束,如果没有前缀和==0的,即位不可能,否则再寻找区间的最后一个0。可以二分寻找。由于是二分套线段树,所以复杂度是 O ( m l o g 2 n ) O(mlog^2n) O(mlog2n)m是2e5,应该可以过吧。。

J

没时间了,因为要检查,直接 O ( n 3 ) O(n^3) O(n3)上了,但是出考场一讨论,傻b了,因为 a ⊕ b ⊕ c = 0 a \oplus b \oplus c=0 abc=0所以 a ⊕ b = c a \oplus b=c ab=c第三个数直接可以出来的, O ( n 2 ) O(n^2) O(n2)于是少了10%的样例。。。

你可能感兴趣的:(总结)