AtCoder Grand Contest 038「A - 01 Matrix」(Ruby)
取っ掛かりさえ見つけられれば、非常に簡単な問題でした
問題
実行時間制限: 2 sec / メモリ制限: 1024 MB
配点 : 300 点
問題文 H 行 W 列からなるマス目があります。 すぬけくんは、各マスに 0 または 1 を書き込みたいです。 その際、以下の条件を全て満たす必要があります。
どの行についても、その行に含まれる 0 の個数と、その行に含まれる 1 の個数のうち、小さい方が A である。 (ここで、 0 , 1 の個数が同じ場合、小さい方はどちらとしてもよい)。 どの列についても、その列に含まれる 0 の個数と、その列に含まれる 1 の個数のうち、小さい方が B である。 これらの条件を満たすように各マスに 0 , 1 を書き込めるか判定し、 可能な場合は条件を満たす書き込み方を 1 つ示してください。
制約 1 ≤ H , W ≤ 1000 0 ≤ A 2 × A ≤ W 0 ≤ B 2 × B ≤ H 入力される値はすべて整数である。
解き方
様々な書き込み方で条件を満たせる場合がありますが、全てにおいて条件を満たす法則を考える必要があります。
今回のケースだと、以下の図の様な書き込み方であれば、どの様な数値が設定されても条件を満たすことが出来ます。
条件さえ分かれば、あとは一行ごと上から順番に出力していくだけです。
コード
h,w,a,b = gets.split.map(&:to_i) (h-b).times { puts ([0] * (w-a) + [1] * a).join } b.times { puts ([1] * (w-a) + [0] * a).join }