ABCやる前に少しだけやってました.
Autumn Fest 2012 A問題
問題
A: Irregular Contest - Autumn Fest 2012 | AtCoder
回答
Submission #400143 - Autumn Fest 2012 | AtCoder
うーん,逐次処理するしかないのかなあと.
最小値を求めて,インデックスを更新して… めんどくさかったです.
素直に向かい合って解けてしまうので,簡単だけど辛かったです.
N, T = map(int, input().split()) pli = list(map(int, input().split())) sli = [list(map(int, input().split())) for _ in range(N)] tli = [list(map(int, input().split())) for _ in range(N)] indexs = [0 for _ in range(N)] while T > 0: minscore = 10001 mini = None for i in range(N): s, index = sli[i], indexs[i] if pli[i] > index and minscore > s[index]: minscore = s[index] mini = i if mini == None: break loss = tli[mini][indexs[mini]] T -= loss if T >= 0: indexs[mini] += 1 res = 0 for (s, i) in zip(sli, indexs): res += s[i - 1] if i > 0 else 0 print(res)
あとこの前言っていたzipメソッドを割と有効活用できている気がする.
for文とも相性いいですよね.
なるべくfor文ではインデックスを使わずに,Javaでいうfor-eachみたいな形でループを回したい(インデックス使うのは割と事故るので)
天下一プログラマーコンテスト2012 予選C B問題
問題
B: ロイヤルストレートフラッシュ - 天下一プログラマーコンテスト2012 予選C | AtCoder
回答
Submission #402653 - 天下一プログラマーコンテスト2012 予選C | AtCoder
10をTに変換すると,ちょうどトランプが二文字の英数字で表せるので,変換して処理….
二文字にできると,内包表記用いて二文字ずつのリスト作りやすいんですよね.こんな感じで.
s = input().replace("10", "T") sli = [s[i:i + 2] for i in range(0, len(s), 2)]
あと,ロイヤルストレートフラッシュになりうるような組み合わせをDictionaryで準備しておき,どれかのDictionaryが埋まったらロイヤルストレートフラッシュ完成,これまで引いたトランプからロイヤルストレートフラッシュの組を引いてやればOK.
s = input().replace("10", "T") sli = [s[i:i + 2] for i in range(0, len(s), 2)] srfc = {"ST": 0, "SJ": 0, "SQ": 0, "SK": 0, "SA": 0} hrfc = {"HT": 0, "HJ": 0, "HQ": 0, "HK": 0, "HA": 0} drfc = {"DT": 0, "DJ": 0, "DQ": 0, "DK": 0, "DA": 0} crfc = {"CT": 0, "CJ": 0, "CQ": 0, "CK": 0, "CA": 0} dics = [srfc, hrfc, drfc, crfc] okdic = None junk = [] for st in sli: junk.append(st) for d in dics: if st in d: d[st] += 1 if sum(d.values()) == 5: okdic = d if not okdic == None: break for k in okdic.keys(): junk.remove(k) print("0" if len(junk) == 0 else "".join(junk).replace("T", "10"))
割と地道な問題を二問解きましたね….