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} floor)

注意要特判(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元购。

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