🍤
[ABC240F] Sum Sum Max を Pythonで解く
考え方
一般的にはそれほど難問とは扱われていませんが、私はすごく苦手で混乱してしまったので、備忘録として残しておきます。まずは、入力例1の最初のテストケースで考えてみます。
数列
このような
上図のように考えると、極大値を求めることができます。あとは、候補となる値で最大のものを求めれば良いです。
実装メモ
def solve():
N,M = map(int,input().split())
a,b = 0,0
for n in range(N):
x,y = map(int,input().split())
if n == 0:
ans = x
if b>0 and x<0:
k = b//(-x)
if k < y:
ans = max(ans, a+x*k*(k+1)//2+b*k)
a += x*y*(y+1)//2+b*y
b += x*y
ans = max(ans,a)
return ans
answers = []
T = int(input())
for t in range(T):
answers.append(solve())
print(*answers,sep="\n")
理解すると、実装自体はそれほど大変ではありません。
Discussion