Port 53

明日のための技術メモ

AtCoder ABC157

AtCoder ABC157解いた分だけまとめ。
今回はABC3完。ついにレートが300台に行った。やったね!
とにかく問題文をしっかり読んで、色々と場合分けしないといけない問題が多かった!

f:id:saturn-glave:20200307230057p:plain

目次

A. Duplex Printing

問題文 f:id:saturn-glave:20200307230211p:plain

両面印刷ということで、印刷したいページ数の偶数・奇数に注意しなくても 切り上げで一発で求められる。

ACしたコード

#coding:utf-8
n = int(input())

print(-(-n//2))

B. Digits

問題文 f:id:saturn-glave:20200307230525p:plain

ビンゴゲームの問題。 サンプルだと右上から左下を一直線で開けてビンゴになるパターンが
抜けているのでもれなく実装するのがポイント。
ビンゴになっていたらexitで抜ける。

ACしたコード

#coding:utf-8
a =[list(map(int, input().split())) for _ in range(3)]
n = int(input())
b = [int(input()) for _ in range(n)]
check = [[0, 0, 0] for _ in range(3)]

#開いているかどうかのチェック表。開いてたら1をつける
for i in range(n):
    for j in range(0, 3):
        for k in range(0, 3):
            if int(b[i]) == int(a[j][k]):
                check[j][k] = 1


#横一列で判定
if sum(check[0]) == 3 or sum(check[1]) == 3 or sum(check[2]) == 3:
    print('Yes')
    exit()
#縦一列で判定
elif check[0][0]+check[1][0]+check[2][0] == 3 or check[0][1]+check[1][1]+check[2][1]== 3 or check[0][2]+check[1][2]+check[2][2] == 3:
    print('Yes')
    exit()
#斜めふたつで判定
elif check[0][0]+check[1][1]+check[2][2] == 3 or check[0][2]+check[1][1]+check[2][0] == 3:
    print('Yes')
    exit()

print('No')

C. Guess The Number

問題文 f:id:saturn-glave:20200307231939p:plain

文字列で読み込ませて操作しようとしたら、
一番左の桁に0が来てはいけないことが 抜けていてWAを叩いてしまった。 計算量的には節約できたはず

ACしたコード

#coding:utf-8
n, m = map(int, input().split())
num = '0' * n
count = [0, 0, 0]


for i in range(m):
    s, c = map(int, input().split())
    # 3桁の数で一番左が0を指定されたか、すでに埋められた数と違う値が来た場合はありえないので強制終了
    if (n >= 2 and s == 1 and c == 0) or (count[s-1] >= 1 and int(num[s-1]) != c):
        print(-1)
        exit()
    else:
        count[s-1] += 1
        if int(num[s-1]) != c:
            num = list(num)
            num[s-1:s] = str(c)
            num = ''.join(num)

#数が2桁以上で一番左の桁が0の時は最小の数を求めるため左の桁を1に差し替え
if len(num) >= 2 and num[0] == '0':
    num = list(num)
    num[0:1] = '1'
    num = ''.join(num)

print(num)