Codeforces Round #377 (Div. 2) A, B, C, D

codeforces.com

A

kを足していって、10で割った余りが0かrになればいい。

Submission #21523193 - Codeforces

B

a_{i+1}^{\prime} = a_{i+1} + min(0, k - (a_i + a_{i+1}))

2つを足して、足りない分を後ろに足せばいい。

n = 1のケースのときは、何もしなくていいらしい。これが分からない。

出したやつがそういう実装になっていたので、
無事AC。

Submission #21526265 - Codeforces

C

紙に書いていろいろなケースを試してみると、

一番大きい値の場所から、

i:(+0, +1, +2)%3
_______________
v:(max, max, max)
v:(max, max, max-1)
v:(max, max-1, max-1)

のケースしかない。これを全探索して、一番小さい値を出力する。

Submission #21533353 - Codeforces

D

いろいろ苦労して間違えたが、全部pretestで引っかかってくれた。

a_i + 1のsumを取って、それ以上の時間iのときにsetに
全部入っていればOKという方針で提出する。
始まりからどう頑張っても勉強時間が足りないものははじく。

i - 1 - a[d[i]] >= 0

AC。

Submission #21545380 - Codeforces

一番最初、嘘解法だと思っていたが撃墜ケースも見つけられない。
これでいいのかな・・・。

別解として、二分探索を利用するものがある。
びくびくするより、こっちの方がスマート。
後ろに0が続いているときに、WAを生やす可能性があるので、
それを取り除く(0が末尾じゃないように調整する)。

Submission #21561791 - Codeforces

なぜ二分探索でいいかというと、ある場所i(答え)を起点に、
左では全部の試験を通過できず、右側では全部の試験を通過できるから。

(false, false, ... , false, true, true, ... , true)

↑の一番最初のtrueの場所を見つけたい。