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)