Codeforces Round #710 (Div. 3) 题解(A-G)

AC代码

A. Strange Table

不妨假设表中的数字从(0)开始,且行列也从(0)开始。

此时数字(x)在按列排时位于((lfloor frac{x}{n} floor, x ext{ mod } n))

而案行排时,((i, j))上的数字为(i + j * m)

最后再转换回来就行了。

B. Partial Replacement

(dp_i)为仅考虑(s_{1 dots i}),将(s_i)*变为x,且符合条件的最小代价。

那么有:

[dp_i = left{ egin{matrix} & infin & ext{if } s_i e * \ & min_{j} dp_j + 1 & ext{if } s_i = * \ end{matrix} ight. ]

为了满足条件1,将(dp_{first})设为1,然后从(first + 1)开始计算。

为了满足条件2,取(dp_{last})为答案。

C. Double-ended Strings

数据量很小,直接暴力。

首先遍历(a)的所有字串,将其加入集合(S)

然后再遍历(b)的所有字串,看其是否再集合(S)中。

复杂度为(O(n^3))

D. Epic Transformation

(cnt_i)(i)(a)中出现的次数,(ma)(max_{i} cnt_i)

如果(ma)超过(n)的一半,那么(i)就不可能会被消完,此时用其余元素与(i)一一配对消除。

否则,就代表可以消完。

注意,第二种情况若(n)为奇数,最后会剩下一个元素。

E. Restoring the Permutation

用一个集合保存排列。将(q)中已有元素删除。

minimum

因为要字典序最小,所以每次遇到重复元素,就拿集合中最小元素放上去。

maximum

因为要字典序最大,所以每次遇到重复元素,就拿集合中当前元素的前驱放上去。

F. Triangular Paths

因为是单向的,所以最终的路径只有一条,其顺序就是将所有点按(r)升序排序。路径确定了,现在只需要算出每一步的代价,然后累加就可以了。

((1, 1))走到((x, y))(x = y),那么只能一直向右走,代价为(x - 1)

((1, 1))走到((x, y))(x = y + 1),可以先向左走,再不断向右走,代价为(0)

而从((1,1))走到((x, y))(x = y + 2)只需要先走到某个(x = y + 1)的点再花1的代价向左走。

以此类推,从((1,1))走到((x, y))的代价为(lfloor frac{x - y}{2} floor)

假设当前位于((cx, cy)),下一步要走到((nx, ny))。此时:

  • 如果(cx - cy = nx - ny),那么只能不断向右走
  • 否则,此时相当于从((1,1))走到((x, y) = (nx - cx + 1, ny - cy + 1)),不过根据(cx + cy)奇偶性的不同,路径的方向可能会是原图的镜像,但是计算方法是相似的。

G. Maximize the Remaining String

最后的结果就是(s)的字符集的某个排列。

考虑贪心,每次枚举尚未用到的字符,从中选一个可行且最大的,将其加入答案的末尾。不断重复至用完所有字符。

判断可行

假设现在的字符串为(s),当前枚举到的字符为(target)

选择(s)中的一个(target),那么其之前的任何字符都需要被删去,且其之后的(target)也要报删去。易得:此时选择第一个(target)会比选择其他(target)更优。

完成操作之后,新字符串的字符集只比原串字符集少掉一个(target),则表示(target)可行。

原文地址:https://www.cnblogs.com/zengzk/p/14583744.html