当前位置: 首页 >> 热点 > > 正文

复盘|第356场周赛

2023-07-30 22:06:54哔哩哔哩


(相关资料图)

满足目标工作时长的员工数目

【遍历】统计多少数字大于target。

统计完全子数组的数目

【滑动窗口】枚举右端点,如果[l, r]]是完全子数组,那么[0, r], [1, r],..., [l- 1, r]也是完全子数组(子数组不同元素个数已经达到最大值),所以以r为右端点时,满足条件的子数组有l+1个。

包含三个字符串的最短字符串

【暴力枚举】为了答案最短,三个字符串的重叠部分越多越好,可以枚举a,b,c的全排列,一共六种拼接方法。代码中,前面可以先特判下完全包含的情况。没有完全包含的情况下,希望重叠的部分最长。python可以自定义排序规则:长度不同时,长度最短优先;长度相同时,按字典序排序。

统计范围内的步进数字数目

【数位DP】定义calc(n)为不超过n的步进数字个数,答案是calc(high) - calc(low) + valid(low),用数位do算calc(n)。定义f(i, pre, isLimit, isNum)为构造第i位及其之后数位的合法方案数,其中,pre表示上一个数位的值,如果isNum为false,可以忽略pre;isLimit为当前是否受到n的约束,若为真,则第i位填入数字至多为s[i],否则是9。如果在受到约束的情况下填了s[i],后续填入的数字仍会受到n的约束,isNum表示i前面的数位是否填了数字,若为假,则当前位可以跳过(不填数字),或者要填入的数字至少是1;若为真,则要填入的数字可以从0开始,例如n=123,在i=0时跳过,相当于后面要构造的是一个99以内的数字,如果i=1不跳过,相当于构造一个10-99的两位数,如果i=1也跳过,相当于构造的是一个9以内的数字。

标签: