C. RationalLee Problem - 1369C - Codeforces
有 n 个整数 1,2,⋯ ,a1,a2,⋯,an,Lee 想要将它们放进 k 个有标号的盒子,使得标号为 i 的盒子中恰有 wi 个数。
定义一个盒子的价值为其中最大数与最小数之和,定义一种放法的总价值为所有盒子的价值之和。Lee 希望求出总价值的最大值。
思路
首先考虑wi=1的盒子:必然是放入最大值,ans*=max(a)*2
在考虑其他盒子:由于盒子中只有最大最小值有意义,那么“中间的”数一定尽量放小的,因此,放一个最大,其他放最小的。
考虑其他盒子的放入顺序,由于时间复杂度为O(n),可以两个顺序都写,再求最大值。
B. Codeforces Subsequences Problem - B - Codeforces
求其中至少有 k 个子序列为 codeforces
的字符串 S。两个子序列不同当且仅当某个位置的字符在一个序列中出现,而在另一个子序列中未出现。比如 codeforcesisawesome
包含四个 codeforces
子序列:
-
codeforces
isawesome
-
codeforce
si
s
awesome
-
codeforce
sisawe
s
ome
-
codeforc
esisaw
es
ome
输出任意一个最短且符合条件的字符串 S 即可。
思路
一眼丁真,一定是形如codeforces的字符串符合题意。
很简单的排列组合,另a*b*c*d*e*f*g*h最大,字母分别代表codeforces字符串中各位字母的个数。
E. Arranging The Sheep Problem - E - Codeforces
一共有 t 组数据,每组数据第一行为 n ,为字符串长度,下一行为一个字符串(只有 ' . ' 和 ' * '字符),每次可以向右或者向左移动 ‘ * ’ 字符,求把所有的 ' * ' 字符连起来的最小移动次数
思路
数学题
先猜测是向中间的*移动
证明是 a+b>=a-a`+b-b`,只考虑有*的区间,在*不占位的情况下将*移动到同一个位置那么要移动的距离应该是一样的,在考虑占位之后,应该尽量让占位分布在两边
仅做理解用,不保真
首先记录*的数量和位置,由于已经确定每个*应在的位置,可以直接计算
公式前半部分是距离mid的位置,后半是中间位的*和当前位的*之间应该预留几个*的位置
C. Rotation Matching Problem - C - Codeforces
-
给定两个长度为 n 的 1∼n 的排列 ai,bi。
-
你可以对任意一个排列进行若干次长度为 k 的 循环右移或左移;这里的循环移动指每个元素依次向左或右移动k 个,如果移出边界的元素再折回到排列的头或尾。
-
你需要求出在移动过后最多有多少个对应的位置使得 ai=bi。
思路
由于每个数字出现一次,可以直接计算两个数组间将各个数字对其需要的移动位数,再统计相同移动位数的数字。