名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

今日の競プロ(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"))


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