AtCoder ABC 131 B – Bite Eating Python解説

スポンサーリンク

Bite Eating

N 個のリンゴがあります。これらはそれぞれリンゴ 1、リンゴ 2、リンゴ 3、…、リンゴ N と呼ばれており、リンゴ i の「味」は L+i-1 です。「味」は負になることもありえます。
また、1 個以上のリンゴを材料として、アップルパイをつくることができます。
その「味」は、材料となったリンゴの「味」の総和となります。

あなたはこれらのリンゴを全て材料として、アップルパイをつくる予定でしたが、おなかがすいたので 1 個だけ食べることにしました。勿論、食べてしまったリンゴはアップルパイの材料にはできません。
つくる予定だったアップルパイとできるだけ同じものをつくりたいので、N 個のリンゴ全てを材料としてできるアップルパイの「味」と、食べていない N-1 個のリンゴを材料としてできるアップルパイの「味」の差の絶対値ができるだけ小さくなるように、食べるリンゴを選ぶことにしました。

このようにして選ばれたリンゴを食べた時、食べていない N-1 個のリンゴを材料としてできるアップルパイの「味」を求めてください。なお、この値は一意に定まることが証明できます。

AtCoder Beginner Contest 「Bite Eating」

アップルパイの味の差の絶対値ができるだけ小さくなるようにしたいので、0に近い味のリンゴが食べるリンゴになります。

まず、全部のリンゴの味の総和を求め、次に味の絶対値が0に近いリンゴを求めます。
最後にリンゴの味の総和から絶対値が0に近いリンゴを引いて答えを出力します。

n, l = map(int, input().split())

a = sum([a for a in range(l, n + l)])

num = 200

for i in range(l, n + l):
    if num >= abs(i):
        num = abs(i)
        ans = i

print(a - ans)

先述した通り、配列aにリンゴの味の総和を入れています。次のfor文で絶対値が最小の値を求めています。最小値を更新したときにnumに代入する値もabsで絶対値にしておかないといけないので注意しましょう。

最後にリンゴの総和からリンゴの味を引いて完了です。