geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

AtCoder Regular Contest 158 備忘録

コンテストページ: AtCoder Regular Contest 158 - AtCoder

コンテスト中AC: A

A - +3 +5 +7

3つの値を同じにする問題は割と良く見る気がします。そして、この系統の問題は、差をどのように詰めるのか、という視点で見ると解ける場合が多いです。

今回、x_2-x_1及びx_3-x_2をそれぞれp,qとおきます。目標は、p=q=0にすることです。

操作によってp,qがどのように変化するか考えます。例えば、(+3, +5, +7)の操作の場合、p,qはそれぞれ+2, +2されます。

操作として考え得る6通りについて、(p,q)がどのように変化するか、その変化量を書き出します。

(+2, +2), (+4, -2), (-2, +4), (+2, -4), (-4, +2), (-2, -2)

ここからわかることとして、p,qは偶数しか変化しません。
そこで、p,qいずれかが奇数である場合、0にするのは不可能です。

以下、p,qが偶数である場合を考えます。
わかりやすくするため、p,q及び操作による変化量を全て2で割っておきます。
変化量は、
(+1, +1), (+2, -1), (-1, +2), (+1, -2), (-2, +1), (-1, -1)
です。

p,qが異なる場合、(+2, -1), (-1, +2), (+1, -2), (-2, +1)のいずれかでp=qにした後、(+1, +1), (-1, -1)のいずれかで0にすることになります。

そこで、次はqpの差を考えます。r=q-pとおきます。

(+2, -1), (-1, +2), (+1, -2), (-2, +1)では、rは3の倍数ずつしか変化しません。そこで、p,qが3の倍数でない場合、0にすることは不可能です。

以下、3の倍数であるとします。
このままだと変化量が多く、ややこしいので、適切に値を入れ替えて、p,qが非負整数かつ、p\leq qとなるようにします。


[補足]
値を入れ替えてもよい理由を説明します。
例えばx_1,x_2,x_3にそれぞれ(+3, +5, +7)するという操作を考えます。

値をx_2,x_1,x_3と入れ替えた場合に、操作についても入れ替えて(+5, +3, +7)にすると、先程の操作を再現できます。

値を入れ替えることで不可能となるような操作が無いことから、値を入れ替えても問題ない、と言えると思います。


こうしておくことで、選ぶべき変化量は(+1, -2), (-1, -1)に限定されます。

r\geq 0になっていることから、最小の操作回数は以下のようになります。

  • (+1, -2)を\frac{r}{3}回してr=0、すなわちp=qにする。
  • (-1,-1)をp+\frac{r}{3}回してp=q=0、すなわちx_1 = x_2 = x_3にする。

実装: Submission #39673899 - AtCoder Regular Contest 158