メモ@inudaisho

君見ずや出版 / 興味次第の調べ物置き場

AtCoder CodeThanksFestival 2018 3完 B Colored Balls

 さてAtCoderやる気がなくなってきたとか書きながら今日も CodeThanksFestival にのうのうと参加した。ただし昨日よりもひどいことに飯をつくりながらやったのでA提出したのが開始25分後だった。ラーメンを鍋で作ってすすりながらやったからそんなもんか。A,C,Dの3完。Python3で絞って実行速度で並べると、Cは参加者の中で2番、Dは1番になれてたのでそこが慰めポイントだが、Bが通せなかった。条件が一つ抜けてたからだが、構造は見えてたのにコードで適切に表現できなかったということでたいした内容ではないけど反省のためにまとめておく。

B Colored Balls

内容

 玉が色別にX個Y個ある。別々に1個3個の組という縛りで自由に取り除いていって全部取り除けるか。

構造

 1個3個ということで1+2と1の組み合わせで考えるとわかりやすく、いける組み合わせは以下の三パターンのどれかになる。

f:id:inudaisho:20181125165934p:plain

1wa

 とここまで見通したのはよかった。しかしこれをきっちりコードに落とせなかった。これなら数字いじるだけなので自分程度の C++の能力でも書けるぞっということでC++でまず書いてみたが通らない。何回かやっても通らないので埒があかず、結局 Python3 で書き直してみたがやっぱり通らない。それがこれ。

iX,iY=[int(_) for _ in input().split()]
if iX == 0 or iY == 0:
    print("No")
else:
    if iX < iY :  #iXの方を大きくする
        iX,iY = iY,iX
    iD = iX - iY
    if iD % 2 : #差が2で割れないとダメ 上図の2のパターン
        print("No")
    else:
       #小さい方から差の半分を引いたものが4で割りきれる。
       #上図の3のパターン(差が0のとき1のパターンになる。)
        if (iY - (iD / 2)) % 4 == 0 : 
            print("Yes")
        else:
            print("No")

 最後までいじくっても結局1waが取れなかった。CDできてBができないのも悔しいので終わったあとで他の人の解答もみたのだが、考え方が違うのばかりみつかって参考にならない。うーむ。

解決

 さてこれだけ単純なのにどこが抜けていたか、それがすぐに見抜けないので小さいところで手間取って何もできないことになるのだが、それはさておき、マヌケだったのはここ。

        if (iY - (iD / 2)) % 4 == 0 : 

 iY と iD/2、つまりXとYの小さい方とXとYの差分の半分ですが、 iYが大きいのは自明じゃないですね。つまりこれをこう書き変えると解決。

        if iY >= iD / 2 and (iY - (iD / 2)) % 4 == 0 :

 あぁあぁあぁぁあぁあぁぁあぁあぁぁあぁあぁぁあぁあぁ こんなことに気付かないなんてぇえぇえ

 まぁ自分で解決できたからいいや。

入門 Python 3

入門 Python 3