水面下の夢

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

今日の競プロ(2015/05/08) その2

解いたARCの問題の紹介.

これも長くなるので,続きから



ARC 011 B

問題

B: ルイス・キャロルの記憶術 - AtCoder Regular Contest #011 | AtCoder

回答

Submission #399356 - AtCoder Regular Contest #011 | AtCoder

文字と対応する数値をDictionaryを使って対応させていく感じでしょうか.
Dictionaryの中にないとエラーになるし,大文字小文字の処理もしないといけないので,細かい点で配慮が必要でした.
あとドット,こいつも厄介でした.

_ = int(input())
dic = {"b":1, "c":1, "d":2, "w":2, "t":3, "j":3, "f":4, "q":4, "l":5, "v":5, "s":6, "x":6, "p":7, "m":7, "h":8, "k":8, "n":9, "g":9, "z":0, "r":0}
res = []
for s in input().split():
    resst = ""
    for c in s:
        if c.isalpha():
            c = c.lower()
        if c in dic:
            resst += str(dic[c])
    if not resst == "":
        res.append(resst)
print(" ".join(res) if len(res) > 0 else "")
ARC 013 B

問題

B: 引越しできるかな? - AtCoder Regular Contest #013 | AtCoder

回答

Submission #399361 - AtCoder Regular Contest #013 | AtCoder

一つ一つの列は降順にならべて,各インデックスの最大の値を探す感じですかね…

10 20 30
20 20 20
30 20 10

ならば,こう置き換えて,

30 20 10
20 20 20
30 20 10

で,max(30, 20, 30) * max(20, 20, 20) * max(10, 20, 10) = 30 * 20 * 20 = 12000 って求められる感じですね.

プログラムの最後が非常にダサいので,改善したいと思ったけどいい案が思いつかないですね….
それと立体,立体というイメージで難しい感じがしましたが,扱っているのがただの数字データだと気がつくと楽でした.

N = int(input())
table = [list(map(int, input().split())) for _ in range(N)]
maxbox = [0, 0, 0]
for elem in table:
     elem.sort(reverse=True)
     for i in range(3):
         maxbox[i] = max(maxbox[i], elem[i])
print(maxbox[0] * maxbox[1] * maxbox[2])
ARC 008 B

問題

B: 謎のたこ焼きおじさん - AtCoder Regular Contest #008 | AtCoder

回答

Submission #399344 - AtCoder Regular Contest #008 | AtCoder

これもDictionaryを上手く使ってやるパターンかなあ.
足りなくなったところは,Dictionaryの値を増やして~みたいな形で.
zip関数の使い方を勘違いしていたことと,dict関数の仕様を勘違いしていたので,ばかみたいに時間がかかりました… 要復習です.

N, M = map(int, input().split())
name = list(input())
kit = list(input())
count = 0
dic = dict(zip(kit, [0 for _ in range(len(kit))]))
for c in name:
    if not c in kit:
        print(-1)
        break
    else:
        dic[c] -= 1
        if dic[c] < 0:
            count += 1
            for ch in kit:
                 dic[ch] += 1
else:
    print(count)
ARC 026 B

問題

B: 完全数 - AtCoder Regular Contest 026 | AtCoder

回答

Submission #399391 - AtCoder Regular Contest 026 | AtCoder

N=1の場合の処理がうまくいかないことが多く,大変でした.
あと割り切れる時のペア見つけるような処理とかね.(36の時に,2のペアは18みたいな…事が言いたい)

from math import sqrt
 
N = int(input())
res = 0
for i in range(1, int(sqrt(N)) + 1):
    if N % i == 0:
        res += i if N == i * i or i == 1 else i + N // i
 
print("Deficient" if N > res or N == 1 else "Abundant" if N < res else "Perfect")

第二弾終わり!!