見出し画像

順序が大事だ…(AGC014A)

こんばんは。えんぴつです。Pythonの記事書くの久しぶりな気がします。
春休みは少しバタバタしていて、あまり触れていなかったのでね。

あ、そうだ。統計検定2級(CBT)に受かりました!2週間前に衝動的に申し込んで、その直後にインターンシップの書類を書かないといけないことに気づいたのでやらかした、と思いましたが…。テスト形式だとやはり集中できて楽しいなと思えるので次は準1級目指して頑張りますかね。準1級は対面でないと受けられないのでいつになるかわかりませんが…勉強記事は特に書く気がないです。他の人が言っていたように統計Web見て過去問解けば合格点とれると思います。あと予備ノリさんの動画もためになります。

…本題に戻りますね。

今回解いたのはAGCのA問題ですね。このA問題やけに難しいな?と思ってたらAGCでした。


問題に上がっている例を手計算していくとA-B、B-Cの絶対値が回数を重ねるごとに半分の大きさになっていることに気づいたので「A-B、B-Cを2で割っていって奇数になった時点でカウントをやめる」という手法をとりました。
(下は証明と手計算のメモです)

ただし、これにはいくつか罠があります。
最初の時点で3つの数のうちどれかが奇数であれば出力は0になります。
さらに、3つの数が偶数かつ同じ数字であれば無限に続くので出力は‐1になります。

結果的にはこのようになったわけですが、

A,B,C=map(int,input().split())
a=A-B
b=B-C
if A%2!=0 or B%2!=0 or C%2!=0:
   print(0)
elif a==b==0:
   print(-1)
else:
   count=0
   while a%2==0 and b%2==0:
       a/=2
       b/=2
       count+=1
   print(count)

ここでifの処理とelifの処理を逆にする(先に同一数字かを確かめる)と、奇数で3つ同じ数になった場合に出力が‐1になってしまうのでそこの順番は気を付けましょう。

もう少し速く処理できる方法として(AC後に調べた)、一番最初に奇数がないかを確かめてからA’=0.5*(B+C)、B’=0.5*(A+C)、C’=0.5*(A+B)で新しいA'、B'、C'を出し、もしも同一になるなら-1を出力、そうでないならカウントを進めるって方法がありました。(コードは省略します)

今回は反例を適切に処理するため、プログラムの順序に気を付けないといけなかったのが特に大変でした。

この記事が気に入ったらサポートをしてみませんか?