D. Berserk And Fireball(Educational Codeforces Round 91 (Rated for Div. 2))

题目链接
题意
给一个序列A,A中所有元素均不同,再给一个序列B。现允许两种操作,
(1)花费x,去除连续k个元素
(2)花费y,取两个连续的元素并把较小的元素去除
问是否可能让A通过操作变为B,如果可以,最少费用是多少?

思路
B里面的元素相对位置如果与A不同,那么肯定不能让A->操作->B
否则,B里面的元素相对位置与A相同
显然,可以把这个A分成很多序列,对于每一个序列,处理操作相同,现讨论一个序列的处理方法。

L [.P.]R
L、R不需要删除
[…]均需要删除,里面当中的最大值P
m表示[…]元素个数

如果m % k不为0

也就是说操作二至少要m%k次,即P消除其他元素。
如果m > k,则通过操作二,m>=k && m%k为0
否则m < k,则通过操作二,m = 1
(如果P > L && P > R,则输出-1)

通过上述操作,可以让m%k为0

显然,必有A->操作->B
如果(x <= k * y),即操作一更优,那么对于m个元素,全部用操作一。
否则,尽量最大化操作二的次数。
如果P<L或P<R,则对于m个元素,全部用操作二
否则,一直进行操作一直到剩下k个元素,对k个元素进行操作一即可

AC代码
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44412226/article/details/107329702