Codeforces Round 1080 (Div. 3) 笔记
Codeforces Better 的插件不知道为什么不能用了,Edge 自带的翻译跟屎一样,干脆用 DS 翻译好了。
A. Sieve of Erato67henes
询问 \(n\) 个数里面有没有 \(67\),感觉比上一次 Div.3 简单...
B. Reverse a Permutation
给定一个长度为 \(n\) 的排列 \(a\)。允许进行任意次操作:选择满足 \(1 \leq i \leq \lfloor n/2 \rfloor\) 的 \(i\),交换 \(a_i\) 和 \(a_{2i}\)。问能否通过若干次操作使整个序列变成严格递增的(即 \(a_i = i\))。
已知下标 \(i\) 可以和 \(2i\) 交换,我们易考虑到 \(i\) 可以移到 \(2^k·i\) 下标上。由此,对于下标 \(2^{k_1}·a\) 和 \(2^{k_2}·b\),若 \(a=b\),则两个下标可以最后互相交换。
于是对于 \(i\) 和 \(a_i\),不断除以 \(2\),直到剩余是一个奇数,判一下两个最后得到的奇数是否相等即可。
C. Dice Roll Sequence
给定一个由 \(1\) 到 \(6\) 的整数组成的序列 \(a_1,a_2,\cdots,a_n\)。每次操作可以将任意一个位置的数改成 \(1\) 到 \(6\) 中的任意整数。我们称一个序列为骰子滚动序列,如果它的每一对相邻元素在标准骰子上是相邻的面(即两个数不相等且和不为 \(7\))。求最少需要多少次操作才能使原序列变成骰子滚动序列。
骰子的相对面之和为 \(7\),因此两个数字可以相邻当且仅当它们既不相等也不互为对面。即对于任意两个数 \(u\)和 \(v\),它们可以相邻的条件是:\(u≠v\) 且 \(u+v≠7\)
由于每个位置只能取 \(6\) 种值,我们可以用动态规划解决。设 \(dp[i][v]\) 表示处理完前 \(i\) 个位置,且第 \(i\) 个位置的值改为 \(v\) 所需的最小操作次数。转移时,枚举前一个位置的值 \(u\),如果 \(u\) 和 \(v\) 可以相邻,则
其中 \([a_i≠v]\) 表示若当前值不等于 \(v\) 则需要一次操作,否则为0。
初始化:\(dp[1][1\le v\le 6]=[a_1≠v]\)
最终答案为 \(min_{v=1}^6 dp[n][v]\)。
时间复杂度 \(O(6^2·n)\)。

浙公网安备 33010602011771号