Codeforces Round #727 (Div. 2) 题解(A-D)

A. Contest Start

分类讨论一下:

  • \(t < x\): 不会有任何冲突,答案为\(0\)
  • \(t = x\): 除了第一个人,其余都有1的冲突,答案为\(n - 1\)
  • \(t > x\): 冲突数依次为\(0, 1, 2, \dots, d - 1, d, d, d, d, \dots\),其中\(d = \lfloor \dfrac{t}{x} \rfloor\)

注意要特判\(n < d\)的情况。

B. Love Song

注意到只要知道区间\([l, r]\)内每个字母的出现次数,就能\(O(26)\)回答一个询问。前缀和搞一下完事了。

C. Stable Groups

将学生按等级排序之后,最终的分组情况会是多个连续的区间。遍历一遍就可以得出不可添加额外学生的最有分组情况。

注意到,相邻的两个区间是可以合并的。记左区间的右端点为\(l\),右区间左端点为\(r\),则可以花费\(\dfrac{a_r - a_l - 1}{x}\)的代价将两个区间合并。

然后贪心优先合并代价小的区间就可以了。

我遇到的一个小问题

我的第一发看错题目了,看成了组内任意两个学生等级之差不能超过\(x\),但是还是过了。这样写和正解之间的差别就在于一开始遍历出的分组情况,我第一发的做法在初始时会分出更多组。但是在本题中,由于代价计算的方式,原本属于同一组,但被我的做法额外分出来的组,最后都会以\(0\)的代价合并。

D. PriceFixed

通过观察发现:

  • 如果有商品能用1元买,那么优先买这些商品是此时最优方案的一种。
  • 如果所有商品都只能用2元买,那么买\(b_i\)最大的商品是此时最优方案的一种。

然后就优先买\(b_i\)大的商品,一旦能1元购就优先买所有的1元购。

posted @ 2021-06-21 10:00  _Backl1ght  阅读(116)  评论(0编辑  收藏  举报