kmjp's blog

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

AtCoder ABC #028 : Python練習編

うーん、しょうもないミスばかり。
http://abc028.contest.atcoder.jp/assignments

A - テスト評価

100点満点のテストの結果がN点だった。
59点以下なら"Bad"、89点以下なら"Good"、99点以下なら"Great"、100点なら"Perfect"と答えよ。

愚直にif文で分岐。101要素の配列を作ってもいいかも?

N=input()

if N<=59:
	print "Bad"
elif N<=89:
	print "Good"
elif N<=99:
	print "Great"
else:
	print "Perfect"

B - 文字数カウント

A~Fで構成された文字列が与えられる。
各文字の登場回数を求めよ。

配列なりmap/hash/dictなりでカウントすればよい。

cnt={}
S=raw_input().strip()
for c in S:
	cnt[c] = cnt.get(c,0) + 1

print "%d %d %d %d %d %d" % (cnt.get('A',0),cnt.get('B',0),cnt.get('C',0),cnt.get('D',0),cnt.get('E',0),cnt.get('F',0))

C - 数を3つ選ぶマン

異なる5つの整数が与えられる。
うち3つを足してできる値のうち、大きい順に3番目のものを答えよ。

まず3つ足してできる値を列挙し、重複を取り除いて3番目を答えればよい。

import sets

A=map(int,raw_input().strip().split(" "))

S = set()
for x in range(5):
	for y in range(x):
		for z in range(y):
			S.add(A[x]+A[y]+A[z])

T=list(S)
T.sort()
print T[-3]

D - 乱数生成

整数N,Kが与えられる。
1~Nの整数のうちどれか1つを等確率で選ぶ、という処理を3回行う。
選んだ3値の中央値がKとなる確率を答えよ。

選ぶ数値はN^3通り。うち以下のケースで中央値がKとなる。

  • 3値ともKとなるのは1通り。
  • 2値がKで残りがK未満となる場合。何回目に選んだ数値がK未満になるかも踏まえると3*(K-1)通り。
  • 2値がKで残りがKより大きい場合。何回目に選んだ数値がKより大きいかも踏まえると3*(N-K)通り。
  • 3値がK未満・K・Kより大きいの場合。選んだ順番6通りも考慮すると6*(K-1)*(N-K)
N,K=map(int,raw_input().strip().split(" "))

total = N**3
yes = 1 + 3*(N-K) + 3*(K-1) + 6*(N-K)*(K-1)

print "%.12f" % (yes*1.0/total)

まとめ

Bの1WAはA~Fのうち1箇所だけタイプミスで小文字にしてしまったこと…。