Port 53

明日のための技術メモ

AtCoder ABC171

AtCoder ABC171解いた分だけまとめ。
体調が優れなかったので、今回はコンテスト終わったあとに解きました。
そしてブログの更新ためてるので消化していきます...

目次

A. αlphabet

f:id:saturn-glave:20200706213213p:plain

問題文

大文字小文字変換をするだけの問題。

ポイント

  • 小文字→大文字はstr.isupper()
  • 大文字→小文字はstr.islower()

ACしたコード

# coding:utf-8
a = input()

if a.isupper():
    print('A')
else:
    print('a')

B. Mix Juice

f:id:saturn-glave:20200706213555p:plain

問題文

最小の合計金額がほしいので、金額の小さい順にソートし、k個分の和を出すだけ。

ACしたコード

# coding:utf-8

n, k = map(int, input().split())
p = list(map(int, input().split()))
ps = sorted(p)

print(sum(ps[0:k]))

C. One Quadrillion and One Dalmatians

f:id:saturn-glave:20200706213828p:plain

問題文

CTFでよく使いそうな問題。ASCII変換を応用して、
26で割ったあまりを活用して文字を変換していく。
aのASCIIコードが97なので、それを起点に文字へ起こす。

ACしたコード

# coding:utf-8
n = int(input())
name = ''
count = 0

while n > 0:
    n -= 1
    mod = n % 26
    name += chr(97 + mod)
    n = n // 26


print(name[::-1])

D. Replacing

f:id:saturn-glave:20200706214205p:plain

問題文

解説AC気味。ぶっちゃけほしいのはAの全要素の和だけなので、
初期のAの和と、要素数と、B→Cに変えた時の増分を求めておく。
そうすることで、一回の操作での増分を更新し、BとCの数を更新しながら
シミュレーションをすることができる

解説ACしたコード

# coding:utf-8
import collections

n = int(input())
a = list(map(int, input().split()))
q = int(input())
sum_a = sum(a)
count = collections.Counter(a)


for i in range(q):
    b, c = map(int, input().split())
    diff = (c - b) * count[b]
    sum_a += diff
    count[c] += count[b]
    count[b] = 0

    print(sum_a)