aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc 125 D - Flipping Signs (python)

最近緑diff をすんなり解けるようになって成長を感じる。上達というよりは緑diff 程度の問題なら考えることはこのくらいかな~みたいな頭の動かし方に慣れてきたんだと思う。

今回は数列の隣り合う2数の正負を好きなようにして最大値を求める問題。
負の数が2連続していたらそこはどうせ正にできるので取り合えず、正負正負正と数がある時を考えて、結局最初の数列で、負の数が偶数 or 0が存在するなら答えは絶対値の総和、
奇数個なら(総和ー絶対値が一番小さいもの*2)で簡単に求まると予想できた
書いたあとで別に0を場合分けする必要はないと気づいたけどそのまま提出した

import sys
input = sys.stdin.readline
n = int(input())
a = [int(i) for i in input().split()]
cnt = 0
ans = [abs(i) for i in a]
s = sum(ans)
mm = min(ans)

for i in a:
  if i < 0:
    cnt += 1

if mm == 0 or cnt%2 == 0:
  print(s)
else:
  print(s-mm*2)