AtCoder ABC172
2020-06-27(土)行われたAtCoderBeginnerContest172の問題をA問題から順に考察も踏まえてまとめたものとなります.
前半ではABCDまでの問題を扱います.
問題は引用して記載していますが,詳しくはコンテストページの方で確認してください.
コンテストページはこちら
公式解説PDF
A問題 Calc
問題文
整数$a$が入力されます。値$a+a^2+a^3$を出力してください。
a = int(input())
print(a + a**2 + a**3)
B問題 Minor Change
問題文
文字列$S,T$が与えられます。次の操作を繰り返して$S$を$T$に変更するとき、操作回数の最小値を求めてください。
操作:$S$の$1$文字を選んで別の文字に書き換える
for文で前から一文字ずつ合っているかどうか確認しました.
s = input()
t = input()
count = 0
for i in range(len(s)):
if s[i] != t[i]:
count +=1
print(count)
C問題 Tsundoku
問題文
二台の机 A, B があります。机 A には$N$冊の本が、机 B には$M$冊の本が、それぞれ縦に積まれています。
机 A に現在上から$i$番目に積まれている本$(1 \leq i \leq N)$は読むのに$A_i$分を要し、机 B に現在上から$i$番目に積まれている本$(1 \leq i \leq M)$は読むのに$B_i$分を要します。
次の行為を考えます。
・本が残っている机を選び、その机の最も上に積まれた本を読んで机から取り除く。
合計所要時間が$K$分を超えないようにこの行為を繰り返すとき、最大で何冊の本を読むことができるでしょうか。本を読むこと以外に要する時間は無視します。
とりあえず,再帰で解こうと思いましたが,実行時間に引っかかるのが明らかだったので,いろいろ工夫を凝らしてコード書きました.
解説にpythonの参考コード載ってて,こんなにシンプルに書けるようになりたいなと思いました.
n, m, k = map(int, input().split())
a_list = list(map(int, input().split()))
b_list = list(map(int, input().split()))
new_a_list = [[0, 0]]
a_sum = 0
for i in range(0, n):
a_sum += a_list[i]
if a_sum <= k:
new_a_list.append([i + 1, a_sum])
else:
break
best = len(new_a_list) - 1
b_sum = 0
a_sum = new_a_list[-1][1]
a_count = new_a_list[-1][0]
flag = 1
for i in range(0, m):
b_sum += b_list[i]
while True:
if b_sum <= k - a_sum:
if best < i + 1 + a_count:
best = i + 1 + a_count
break
if a_count == 0:
flag = 0
break
a_count -= 1
a_sum = new_a_list[-(len(new_a_list) - a_count)][1]
if flag == 0:
break
print(best)
D問題 Sum of Divisors
問題文
正整数$X$に対し、$X$の正の約数の個数を$f(X)$とします。
正整数$N$が与えられるので、$\sum_{K=1}^{N}K×f(K)$を求めてください。
圧倒的数学力不足(汗)
解けなかったので,解説見て書いてあることそのまま実装したら解けました.
n = int(input())
total = 0
for j in range(1, n + 1):
x = j
y = n // x
total += y * (y + 1) * x // 2
print(total)
実装はシンプルだけど思いつかなかったし,そもそも実行時間制限: 3 sec 見落としてた.(見落としてなくても解けないと思うけど)
前半はここまでとなります.
前半の最後まで読んでいただきありがとうございました.
後半はEF問題の解説となりますが,時間的に記事作成できないと思います(汗).