AtCoder Beginner Contest 157 過去問
ABCの現状
現在の自分の現状を省みて、A~C問題を完璧にしようという結論に至りました。
とりあえず茶色Coderになるまでです。
現状、C問題で2回に1回ペースでWAで弾かれ、
調子の悪い時はBで弾かれます。
A問題
楽々クリア。
import math print(math.ceil(int(input())/2))
B問題
ビンゴ問題。
これはnumpyを使えばよかったなあと後になって気づきます。
numpyだと縦列の一致はaxis=1、横列の一致はaxis=0。
縦列取得ができていないことに気づかず、WA連発してしまいました・・・。
斜めもnp.diag()で取得できます。
これからはnumpyを積極活用していこうな。
A = [list(map(int,input().split())) for i in range(3)] n = int(input()) for j in range(n): b = int(input()) for j in range(3): for k in range(3): if b==A[j][k]: A[j][k]=0 for k in range(3): if sum(A[k][:])==0: print('Yes') exit(0) ri = [[a[k] for a in A]for k in range(3)] for k in range(3): if sum(ri[:][k])==0: print('Yes') exit(0) if (A[0][0]+A[1][1]+A[2][2]==0)or(A[2][0]+A[1][1]+A[0][2]==0): print('Yes') exit(0) print('No')
C問題
書いたコードです。
サンプル例ではうまく通りましたが、WAで弾かれました。
自分的には2つの案が浮かびました。
- 1~1000を総当たりで試していく
- 各桁の数字を当てはめてから、可能性のある数字の中から最小値
自分は後者で実装しました。
1桁目 → 7
3桁目 → 1
最小は701やろ!
惑わされたのは"-1"となるエラー処理。
- 各桁で重複する数字を持つ場合、"-1"
- 1桁目が0の場合、"-1"
この処理を最初に書いてしまいました...。
n,m= map(int,input().split(' ')) num = {} keta = [100,10,1] for i in range(m): s,c = map(int,input().split(' ')) s = keta[s-1] if ((s in num) and num[s]!=c) or (s==100 and c==0): print('-1') exit(0) else: num[s] = c number = 0 for d in num: number+=d*int(num[d]) print(number)
WriteUpと照らしわせました。
kabukimining.hateblo.jp
n,m = map(int, input().split()) SCs = [list(map(int, input().split())) for _ in range(m)] print(SCs) for i in range(0, 10**(n)): istr = str(i) # print(istr) tf = True if len(istr) == n: for j in range(m): if istr[SCs[j][0]-1] != str(SCs[j][1]): tf = False if tf: print(i) print('-1')
各桁で重複する数字を持つ場合、"-1"
入力した桁数と数字の組み合わせに対して、"全てに一致する"数字を探しています。
1桁目が7
1桁目が2
→ 矛盾しているので、総当たりでも見つからない。
1桁目が0の場合、"-1"
1桁目が0
→ 1からの総当たりだと、永遠に見つからない。