ABC472 B - Break a Stick
棒を折る
考え方
全ての場所で実際に折ってみればよい。
各折り方、左側と右側でそれぞれ長さを合計し、差の絶対値をとる。
それの最小値記録を答えればよい。
答えるだけなら以上で終わりなのだが、少し工夫したやり方がある。
まず、最初に全ての長さを右側の値として合計しておく。
その後、左にある部分から順に $1$ つずつ、右側合計から引いて左側合計に足していく。
こうすると、二重ループを避けることができる上に、処理も高速になる。
まあ、処理の高速化の方は、やったところでC問題以降でないと特に恩恵はないのだが……。
入力例1での動作
入力を受け取る。
n: 4
l: {5, 2, 3, 8}
最初は全て右側にあるものとして、左側合計を $0$、右側合計を $18$ とする。
左から $1$ つずつ移動すると、次のようになる。
| 左へ移す長さ | 左側合計 | 右側合計 | 差の絶対値 | 最小値記録 |
|---|---|---|---|---|
| $5$ | $5$ | $13$ | $8$ | $8$ |
| $2$ | $7$ | $11$ | $4$ | $4$ |
| $3$ | $10$ | $8$ | $2$ | $2$ |
よって、実際の $3$ 箇所の切れ込みの中では、最小値記録は $2$ となる。
この後、最後の $8$ も左へ移した状態まで同じように調べる。
このとき左側の合計は $18$、右側の合計は $0$ となる。
これは切れ込みで折った状態ではないが、差は $18$ なので最小値記録は更新されない。
したがって、答えは $2$ である。
注意点
特になし。
別解
特になし。