AtCoder AGC038
初めてAGC出てみましたが見事に爆死しましたー
Aだけでも解ければ嬉しいなーのノリで出てみたけれどレベル差を痛感した。
ということで、今回はA問題の解き直しを書きます。
AGC038 A 01Matrix
AGC038 A
行列の扱いの問題。解説PDFみたら超あっさりだった...
解き直し
市松模様をイメージすると良いとのこと。
こういう発想がすぐに出るようになりたい...
#coding:utf-8 h, w, a, b = map(int, input().split()) #a,bが行・列の半分より大きいものは実現不可(最小値なので) if a > (w//2) or b > (h//2): print('No') else: for _ in range(h-b): print('1'*(w-a) + '0'*a) for _ in range(b): print('0'*(w-a) + '1'*a)
これ以降は自分用メモ(という名のお焚き上げ)
大会中
特に出力のところを愚直に考えてしまって、時間がかかった。
どうやってうまく被らないように表示するのかがはっきり見えなかったなぁ。
地味に2次元配列の出力だったり列での合計をnumpyで求める方法を確認したりするなど...
出力不能な条件が甘かったのと、行数列数でfor文が動かないなど、いまひとつな感じで終わった。
2次元配列をきれいに出力
これで括弧もコロンも出ず、綺麗に要素だけ出力できる
for item in matrix: print(*item)
numpyで要素数の合計を出す
pandas使えなかったと思うのでnumpy慣れないといけない。
axisが0の時は列の合計、1の時は行の合計を出す。
import numpy as np ans = [[0] * w for i in range(h)] row = np.sum(ans, axis=0) col = np.sum(ans, axis=1)
書いていたコード
#coding:utf-8 import numpy as np h, w, a, b = map(int, input().split()) ans = [[0] * w for i in range(h)] def print_ans(h, w, a, b, ans): #列と行でa,bの範囲を超えていないかチェック用 row = np.sum(ans, axis=0) col = np.sum(ans, axis=1) #a, bを1の数として考える。各要素でa, bの範囲を超えていないか確認する if a > 0 and b > 0: for i in range(0, h): for j in range(0, w): if col[i] < a and row[j] < b: ans[i][j] = 1 row = np.sum(ans, axis=0) col = np.sum(ans, axis=1) #print(col, row) #print(ans) #出力 for item in ans: print(*item) if __name__ == "__main__": if a <= (w//2) and b <= (h//2): print_ans(h, w, a, b, ans) else: print('No')