Educational Codeforces Round 144 (Rated for Div. 2)【A - D】
路漫漫啊……
A. Typical Interview Problem
题解
字符串以 个数为周期进行循环,循环节为 FBFFBFFB
。
代码
1 |
|
B. Asterisk-Minor Template
题解
-
如果首部或尾部字母相同,那么一个
*
即可 -
否则首部尾部各有一个
*
,为了使*
的数目较少,至少要有两对字母相同,此时为*a...a*
的形式:-
如果两对字母内相同的字母不与两个字母相邻,那么为
*a*a*a*
的形式,不符合条件 -
所以两个字母内相同的字母必须与两个字母之一相邻,即为
*aa*a*
或*a*aa*
的形式,此时可以归为*aa*
的形式
-
所以可以发现最少只需要 a*
、 *a
、 *aa*
三种形式的字符串。
代码
1 |
|
C. Maximum Set
题解
一些 observation :
- 满足条件的集合中,较小的数的质因子幂次是较大的数的子集
- 最长的集合一定都是某个数乘以 2 的幂次,即
- 首项的最小值
所以最大幂次的值 ,集合的最大长度为 ,同时反推出首项的最大值 ,所以首项不同的集合共有 个。
注意到一个性质: ,即 ,所以可能存在 ,即将倒数一些数因子中的一个 换为 仍可能满足条件,此时末项为 ,首项的最大值 ,由于可以将连续倒数 个数中的因子替换,所以这种类型的集合共有 个。
所以集合的最大长度为 ,总数为 。
Tips: 可能小于 。
代码
1 |
|
D. Maximum Subarray
题解
先令 ,然后令 ,此时问题即变为选 个数加上 后计算最大连续子段和:
-
若 ,那么这 个数要尽量选满在最大区间内
-
若 ,那么这 个数要尽量选在两边,远离最大区间
这两种情况可以分别归纳为:先选前 个,然后将所选区间循环 右移/左移 的情况。
此时问题变为单点修改,区间查询最大连续子段和,用线段树即可。
Tips:当 时,也可以令 ,此时只需要循环右移即可。
代码
1 |
|
Educational Codeforces Round 144 (Rated for Div. 2)【A - D】