D. Yet Another Yet Another Task
https://codeforces.com/contest/1359/problem/D
这题不看editorial也是做不出来的。讨论区里面说这题其实还有比较老实的办法完成,不过我也没有仔细看这些实现方式,好像还蛮复杂的。
这题目有两个关键点:
- 枚举可能的最大值,因为最大值就是[0,30],所以时间复杂度没啥问题。
- 在满足最大值区间的情况下计算区间和的最大值。
editorial里面的思路是,如果某个值大于mx的话,那么可以使用替代值-inf. 所以最终代码是
def run(arr): ans = 0 inf = 10 ** 9 for mx in range(0, 31): cur = 0 best = 0 for x in arr: cur += -inf if x > mx else x best = min(cur, best) ans = max(ans, (cur - best) - mx) return ans
我看到这个提交也比较有意思 https://codeforces.com/contest/1359/submission/82315324. 它并没有将大于mx的值设置成为-inf. 而是只使用<=mx的值。计算最大子序列之和是个经典的问题,在这个问题的基础上扩展下,当遇到>mx的话那么认为序列到此结束了。我觉得下面这个解法可能更好理解。
def run(arr): ans = 0 for mx in range(0, 31): acc = 0 for x in arr: if x > mx: acc = 0 continue acc += x acc = max(acc, 0) ans = max(ans, acc - mx) return ans