AtCoder Beginner Contest 172 / Python
結果
参加していません!
ちょっと遊ぶ約束がありまして。
ということで、今日は後で解いてみたものです。
問題と解答と勉強
提出したコード
a = int(input()) print(a + a**2 + a**3)
提出したコード
S = input() T = input() count = 0 for i in range(len(S)): if S[i] != T[i]: count += 1 print(count)
勉強用コード
n, m, k = map(int, input().split()) A = list(map(int, input().split())) B = list(map(int, input().split())) a = [0] b = [0] for i in range(n): a.append(a[i] + A[i]) for i in range(m): b.append(b[i] + B[i]) ans = 0 for i in range(n + 1): if a[i] > k: break while a[i] + b[m] > k: m -= 1 ans = max(ans, i + m) print(ans)
わからんかった。良かったわぁ、参加しないで。
最初考えたやつ(TLEになる)
n, m, k = map(int, input().split()) A = list(map(int, input().split())) B = list(map(int, input().split())) a = [0] b = [0] for i in range(n): a.append(a[i] + A[i]) for i in range(m): b.append(b[i] + B[i]) ans = 0 for i in range(n+1): for j in range(m+1): if a[i] + b[j] <= k: ans = max(ans, i+j) print(ans)
こういう数え方にしたのだけど、時間オーバーする。
これを、
bの方を後ろから数える。
a=0 のとき 460ダメ、310ダメ、230オーケー
a=1 のとき 230ダメ、80オーケー
という具合に、a=0 のときにオーバーになった460と310は確認しなくて良い。
これでだいぶ早くなり、通る。
前から確認していっても同じような感じに出来る気もするんだけど、
あんまり奇麗に作れなかったんで、やっぱり後ろからが良いのかも。
上手いこと考えるよねぇ、ほんとに。
勉強用コード
n = int(input()) s = 0 for i in range(1, n+1): q = n//i s += q*(q*i+i) // 2 print(s)
わからんかった。
最初考えたコード(LTEになる)
n = int(input()) table = [0] * (n+1) for i in range(1, n+1): for j in range(i, n+1, i): table[j] += 1 ans = 0 for i, j in enumerate(table): ans += i*j print(ans)
1~n までの約数の個数を列挙する
def num_divisors_table(n): table = [0] * (n + 1) for i in range(1, n + 1): for j in range(i, n + 1, i): table[j] += 1 return table print(num_divisors_table(6))
というのを利用してみたのだが、時間が間に合わない。
そこで、
縦に集計していたのを止めて、
横に集計する、等差数列の和の公式でいける。
項数が q = n // i
初項 i 、項数 q 、末項 q × i で、
s += q*(q*i+i) // 2
という訳だ。
いや、難しいわぁ。
C問題 も D問題 も他の人が提出したのを見ても何をしてるかわからなくて、
だいぶ悩んでしまった。これを時間内に自分で思い付くのはキツイ。
精進致します。
C問題、D問題の時点で厳しかったのでパス!!