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からの総当たりだと、永遠に見つからない。