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元购。