AtCoder Grand Contest 038「A - 01 Matrix」(Ruby)

取っ掛かりさえ見つけられれば、非常に簡単な問題でした

問題

atcoder.jp

実行時間制限: 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 入力される値はすべて整数である。

解き方

様々な書き込み方で条件を満たせる場合がありますが、全てにおいて条件を満たす法則を考える必要があります。

今回のケースだと、以下の図の様な書き込み方であれば、どの様な数値が設定されても条件を満たすことが出来ます。

f:id:ryoutaku_jo:20190922004025p:plain

条件さえ分かれば、あとは一行ごと上から順番に出力していくだけです。

コード

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 }

f:id:ryoutaku_jo:20190922001344p:plain