kmjp's blog

競技プログラミング参加記です

AtCoder ABC #039 : Python練習編

またしょうもないミスをする…。
http://abc039.contest.atcoder.jp/assignments

A - 高橋直体

愚直に表面積を計算するだけ。

X,Y,Z=map(int,raw_input().strip().split(" "))
print (X*Y+Y*Z+Z*X)*2

B - エージェント高橋君

Nを0.25乗してもよいし、Xは1000を超えないのでXを1から順に探しても良い。

print int((input()+0.001)**0.25)

C - ピアニスト高橋君

鍵盤をドから初めて何周分か書いておこう。
入力がその(0-originで)0,2,4,5,7,9,11文字目から20文字分と一致するなら、それぞれドレミファソラシドとなる。

T=raw_input().strip()

S="WBWBWWBWBWBWWBWBWWBWBWBWWBWBWWBWBWBWWBWBWWBWBWBW"
A=["Do","Re","Mi","Fa","So","La","Si"]
B=[0,2,4,5,7,9,11]

for i in range(7):
	if T == S[B[i]:B[i]+20]:
		print A[i]

D - 画像処理高橋君

各セルに白黒の2値が振られたグリッドが与えられる。
収縮を行うとは、各セル及びその隣接8マスに1個でも色が塗られているセルがあれば、そのセルに色を塗る、という処理を全セル同時に1回行うことに相当する。
1度収縮を行った状態のグリッドが与えられる。収縮前のグリッドが構築可能なら1例を示せ。

入力値、すなわち収縮後にも色が塗られていないマスがあるということは、収縮前はそのマスと周囲8マスは色が塗られていなかったはずである。
それ以外のセルは元々塗られていたと考えて良い。
これによりまず収縮前のグリッドの候補を構築できる。
あとはこのグリッドに再度収縮を行い、元と一致するか確認するとよい。

H,W=map(int,raw_input().strip().split(" "))
S = []
T = []
G = []

for y in range(H):
	S.append(list(raw_input().strip()))
	T.append(["#"]*W)
	G.append(["."]*W)

for y in range(H):
	for x in range(W):
		for tx in range(x-1,x+2):
			for ty in range(y-1,y+2):
				if tx >= 0 and tx < W and ty >= 0 and ty < H and S[y][x]==".":
					T[ty][tx] = "."

for y in range(H):
	for x in range(W):
		for tx in range(x-1,x+2):
			for ty in range(y-1,y+2):
				if tx >= 0 and tx < W and ty >= 0 and ty < H and T[y][x]=="#":
					G[ty][tx] = "#"

if S != G:
	print "impossible"
else:
	print "possible"
	for t in T:
		print "".join(t)

まとめ

なんかDの問題はこれっぽいなと思ったりしていた。
TopCoder SRM 560 Div1 Medium DrawingPointsDivOne - kmjp's blog