Codeforces1409 题解(A-F)

AC代码

A. Yet Another Two Integers Problem

最优的操作中,\(k = \min(10, abs(a - b))\),记\(d=abs(a-b)\),最终的答案为\(ans = \lfloor \frac{d}{10} \rfloor + [10|d]\)

B. Minimum Product

猜结论:最优的情况必定是先把可用次数尽可能地用在其中一个数,然后再将剩余操作尽可能地用在另外一个数上。

分别算出先a后b和先b后a的答案,然后取最小值即可。

C. Yet Another Array Restoration

根据题目描述得出:数组\(a\)是等差数列。

枚举\(x\)所在的位置和\(y\)所在的位置,然后就可以得出公差,首项和末项。如果首项大于零且末项大于等于\(y\),那么目前这个数列就是合法的。然后再贪心地取末项最小的就可以了。

D. Decrease the Sum of Digits

通过观察可以得到一个结论,就是一次操作必定要使当前位产生进位才会使各个位上数字的和减少,否则各个位上数字的和必定会增加。

然后就从低位到高位枚举,若当前各个位置上的和大于\(s\),就将当前位加到产生进位,然后枚举下一位,否则就可以结束枚举。

E. Two Platforms

通过观察可以发现:

  • \(y_i\)在这题中并不重要,可以将题目从二维转化为一维
  • 两块板子相离的结果必定优于两块板子相交或相切的结果
  • 板子的起点必定是点集中的某一个点

将点按\(x_i\)排序之后,若已知板子的覆盖范围,就可以用\(O(\log n)\)的时间求出板子覆盖了多少球。

枚举点集中的点,可以知道若板子的起点为\(x_i\),板子可以覆盖多少个点。

加上后缀最大值的处理,就可以知道若板子的起点大于等于\(x_i\),板子最多可以覆盖多少个点。

最后,只需要枚举第一块板子的起点,就可以知道第一块板子覆盖了多少个点,然后根据观察发现的第二个性质和后缀最大值就可以得到第二块板子最多覆盖多少个点,贪心地取最大值即可。

F. Subsequences of Length Two

一道比较有意思的dp

\(dp_{i,j,c}\)表示对于\(s[0...i-1]\),使用\(j\)次修改操作,前\(i\)个字符里包含\(c\)\(t_0\)时的答案。

每次要么把\(s_i\)变为\(t_0\),要么把\(s_i\)变为\(t_1\),要么不操作

然后分析一下就可以得到状态转移方程

posted @ 2020-09-05 17:17  _Backl1ght  阅读(360)  评论(0编辑  收藏  举报