読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

今日の競プロ(2015/05/10)

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"))


割と地道な問題を二問解きましたね….