AtCoder Regular Contest 006
はい。
https://atcoder.jp/contests/arc006
A - 宝くじ
PyPy3
e=[int(i) for i in input().split()] b=int(input()) l=[int(i) for i in input().split()] ans=0 for i in l: if i in e: ans+=1 if ans==6: print(1) elif ans==5 and b in l: print(2) elif ans==5: print(3) elif ans==4: print(4) elif ans==3: print(5) else: print(0)
買ったくじLの数字が当選番号Eの中にいくつあるか数える。5個だった場合はボーナス数字があるかも確認する。当選条件を満たさない場合に0を出力するのも忘れずに。
B - あみだくじ
PyPy3
n,l=map(int,input().split()) w=[input() for i in range(l)] t=input() ans=t.index("o") for i in range(l-1,-1,-1): if ans-2>-1 and w[i][ans-1]=="-": ans-=2 elif ans+2<n*2-1 and w[i][ans+1]=="-": ans+=2 print(ans//2+1)
oのゴールから移動をシミュして辿り着くトコが解になる。端とか縦線1本のみの場合とかに気をつける。
C - 積み重ね
PyPy3
n=int(input()) l=[int(input()) for i in range(n)] ans=[] ans.append(l[0]) for i in range(1,n): f=1 for j in range(len(ans)): if l[i]<=ans[j]: ans[j]=l[i] f=0 break if f: ans.append(l[i]) ans.sort() print(len(ans))
最初に1個目のダンボールだけのリストを用意する。2個目以降は重ねられるなら重ねる(リスト内の値を更新する)。重ねられないならリストに追加する。常に小さい方から確認するようにリストをソートするのを繰り返す。
最後にリストの長さが解になります。
D - アルファベット探し
Python3
xy=[(1,0),(-1,0),(0,1),(0,-1),(-1,-1),(-1,1),(1,1),(1,-1)] h,w=map(int,input().split()) l=[list(input()) for i in range(h)] ans=[0]*3 for p in range(h*w): i=p//w j=p%w if l[i][j]=="o": t={(i,j)} l[i][j]="x" cnt=1 nin=nax=j while len(t): a,b=t.pop() for x,y in xy: x,y=x+a,y+b if l[x][y]=="o": cnt+=1 l[x][y]="x" t.add((x,y)) nin,nax=min(nin,y),max(nax,y) cnt//=((nax-nin+1)//5)**2 if cnt==12: ans[0]+=1 elif cnt==16: ans[1]+=1 elif cnt==11: ans[2]+=1 else: ans[4]+=1 #RE print(*ans)
PyPy3を使うとMLEになります。
Aは12個のo、Bは16個、cは11個です。
左上から見ていってoがあったら縦横斜めにいくつoがあるかと、座標の端の値を取ります。最大値-最小値+1が5の倍数になるはずです。5のn倍だとn倍の大きさの文字A,B,Cです。
oの個数を数えるときに任意の文字に置換するか、座標をメモする(のは多分止めておいた方がいいです)かで重複して数えないようにします。
n倍の大きさの文字はn2個のoになります。n2で割ると12,16,11のいずれかの数になるはずです。
12,16,11になる個数をそれぞれ数えていくと解になるはずです。