kmjp's blog

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

AtCoder ARC #013 : Python練習編

さてようやく最後。
http://arc013.contest.atcoder.jp/assignments

C++の時の記事。
http://kmjp.hatenablog.jp/entry/2013/03/23/0900
http://kmjp.hatenablog.jp/entry/2013/03/23/0930

A - 梱包できるかな?

大きな直方体の中に、小さな直方体を同じ向きで何個詰め込めるか最大値を答える。
小さな直方体のどの辺をどの辺に平行にするかで6通り試せばよい。

B=map(int,raw_input().split(" "))
L=map(int,raw_input().split(" "))

m=max((B[0]/L[0])*(B[1]/L[1])*(B[2]/L[2]),(B[1]/L[0])*(B[0]/L[1])*(B[2]/L[2]))
m=max(m, (B[0]/L[0])*(B[2]/L[1])*(B[1]/L[2]), (B[1]/L[0])*(B[2]/L[1])*(B[0]/L[2]))
m=max(m, (B[2]/L[0])*(B[0]/L[1])*(B[1]/L[2]), (B[2]/L[0])*(B[1]/L[1])*(B[0]/L[2]))

print(m)

B - 引越しできるかな?

複数の直方体の大きさを与えられるので、それぞれを1箱で内包できる大きな直方体のサイズの最小堆積を答える。
各直方体の辺の長さをソートと、1番目同士・2番目同士・3番目同士の最大値の積を取ればよい。

C=input()
M=[0,0,0]
for i in range(C):
	B=map(int,raw_input().split(" "))
	B.sort()
	M[0]=max(M[0],B[0])
	M[1]=max(M[1],B[1])
	M[2]=max(M[2],B[2])

print(M[0]*M[1]*M[2])

C - 笑いをとれるかな?

ハバネロの入った位置の外側の座標についてnim処理を行えばよい。
C++で書いたときは一旦値を配列に入れたけど、考えたら配列入れずに適宜xorすれば十分だね。

nim=0
N=input()
for i in range(N):
	bx,by,bz=map(int,raw_input().split(" "))
	ix=iy=iz=10**10
	ax=ay=az=0
	M=input()
	for j in range(M):
		hx,hy,hz=map(int,raw_input().split(" "))
		ix=min(ix,hx)
		iy=min(iy,hy)
		iz=min(iz,hz)
		ax=max(ax,hx)
		ay=max(ay,hy)
		az=max(az,hz)
	nim ^= ix^iy^iz^(bx-1-ax)^(by-1-ay)^(bz-1-az)

print("LOSE" if nim==0 else "WIN")

まとめ

これでARC#013まで追いついたということで、Python練習編はこれで終了。
今後は本番もC++とPythonの書きやすい方で書いていこう。
AやBで、文字列主体ならPythonにしようかな。