关于校内赛第二题,当天提交人数非常多,但是通过的却很少。赛后也有很多同学问我这个题目的数据有什么陷阱之类的。其实数据是没有任何问题的,只是方法不够正确。大多数队伍都是在一些针对贪心的数据上挂了。judge的时候我看过一些同学的代码,基本上都是用贪心做的。(有一个AC的队貌似是用贪心过的,代码比较复杂。希望这个队伍来讲讲他们贪心策略,如果没有记错,应该是CH3CHO他们队)
事实上,这个题目有一个很直接的做法就是枚举最优方案中最高和最矮的小塔高度,然后判断这个方案是否可行。
假设当前枚举的最高和最矮的小塔高度分别为maxNow, minNow, 另外保存一个零时变量cancel (init = 0)那么只需要一遍扫描,判断当前高度currHeight.
if currHeight > maxNow
cancel += currHeight - maxNow
if currHeight < minNow
cancel += currHeight
最后只需要判断cancel <= M 那么这就试一组有效解。
在所有有效解中选择一个 maxNow - minNow最小的,即为最优解。