ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

AtCoder Petrozavodsk Contest 001 B - Two Arrays

問題
提出コード

解法

a_{i}b_{i}を同じ数字にそろえる場合に、3パターンの選択の方法があります。

  • a_{i}を選び、b_{i}以外を選ぶパターン
    a_{i}a_{i}+2になり、b_{i}は据え置きです。
    この方法だと、a_{i} \lt b_{i}かつb_{i}-a_{i}が偶数の場合にそろえることができます。

  • a_{i}b_{i}を選ぶパターン
    a_{i}+2,b_{i}+1になります。ので、a_{i} \lt b_{i}の場合、これを行うことでそろえることができます。

  • a_{i}以外を選び、b_{i}を選ぶパターン
    a_{i},b_{i}+1になります。
    a_{i} \gt b_{i}の場合にそろえることができます。

これらより、a_{i} \lt b_{i}の際は、2つめの方法でいくらでも数を調整することができますが、a_{i} \gt b_{i}の際は3つめの方法を使うしかありません。
しかし、3つめの方法を利用するには、その回数分だけ、同時に1つめのパターンも行うことになります。
ということで、結局は、1つめのパターンと3つめのパターンを同時に行い、3つめのパターンが必要な部分の数を全てそろえた後、残った部分を2つめのパターンを利用してそろえる、というのが確実な方法になります。
ここで、3つめのパターンを行う必要がある回数は、\sum max(0,a_{i} - b_{i})です。1つめのパターンは、a_{i} \lt b_{i}である限り行うことができるので、最大で \sum max(0,\frac{b_{i} - a_{i} }{2})回行うことができます。
なので、結局問題の条件を満たすかどうかの判定は、

  • \sum max(0,a_{i} - b_{i}) \leqq \sum max(0,\frac{b_{i} - a_{i} }{2})

を満たしているかどうかと一致します。

感想

この問題、大学の友人との勉強会でも出題したのですが、説明が難しすぎます…
結局調べるべきことはシンプルなのですが、その発想に至るまでの経緯が少し複雑でした。