Port 53

明日のための技術メモ

AtCoder AGC038

初めてAGC出てみましたが見事に爆死しましたー
Aだけでも解ければ嬉しいなーのノリで出てみたけれどレベル差を痛感した。
ということで、今回はA問題の解き直しを書きます。

AtCoder AGC038

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')