前回は調子よくてもunratedで、今回は久々の0ptと最悪。
https://community.topcoder.com/stat?c=problem_statement&pm=17312&rd=18982
問題
トランプを以下のようにシャッフルする。
- 初期状態ではジョーカーを除く52枚が並んでいる。先頭にハートがA~Kまで並んでいるのでそれを取り除く。
- 残り39枚をシャッフルする
- 山の上から10枚目と11枚目の間に、先ほどのハートのA~Kを挿入する
- 山を上から大体で3等分にする
- その際、真ん中の山の一番上のカードを覚える。
- それぞれの山をシャッフルする。
- もともと一番上にあった山の一番上のカードを覚える。
- 元の山を、上から真ん中・下・上の順に積む。
最終的なカードの並びが与えられる。
覚えた2枚のカードを答えよ。
解法
ハートが11~23枚目にあるので、山を3等分したときは、この途中で上と真ん中の山が分かれる。
その後、この上の山は後ろに持ってくるので、最初に覚えたカードは、最終的なカード52枚のうち、上半分26枚に現れるハートのカードのうち最も番号が小さいものとなる。
また、もともと上の山は、ハート以外には10枚のカードを持つ可能性が高い。
そこで、2枚目に覚えたカードは、最終的なカードで後ろから(上記1枚目に覚えたカードより小さいハートの枚数)+10枚目のカードである可能性が高い。
class MagicTrickWithCuts { public: string solve(vector <string> queries) { string R; FORR(S,queries) { int a=0,b=0; char c='Z'; int i; FOR(i,26) c=min(c,S[i]); R+=c; R+=S[52-10-(c-'A')]; } return R; } }
まとめ
プログラムの問題なのかこれ…。