名もなき未知

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

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

第二弾終わり!!