kmjp's blog

競技プログラミング参加記です

TopCoder SRM 819 : Div1 Easy Div2 Hard MagicTrickWithCuts

前回は調子よくても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;
		
	}
}

まとめ

プログラムの問題なのかこれ…。