AtCoder Beginner Contest 172 / Python


f:id:penyooo:20200112235130p:plain


  • 独学者です。( 2019 / 9 ~ )
  • AtCoder の問題に Python で取り組んでいます。
  • ABC で4問目(茶か緑)まで解けることを目標にしています。

完全に独学なのでコードは酷いと思います。

AtCoder やってる方、お気軽にコメントください。





結果



参加していません!

ちょっと遊ぶ約束がありまして。

ということで、今日は後で解いてみたものです。





問題と解答と勉強


atcoder.jp



提出したコード
a = int(input())
print(a + a**2 + a**3)









atcoder.jp



提出したコード
S = input()
T = input()

count = 0

for i in range(len(S)):
  if S[i] != T[i]:
    count += 1

print(count)









atcoder.jp



勉強用コード
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)


f:id:penyooo:20200628090306p:plain
こういう数え方にしたのだけど、時間オーバーする。

これを、

f:id:penyooo:20200628090632p:plain
bの方を後ろから数える。

a=0 のとき   460ダメ、310ダメ、230オーケー

a=1 のとき   230ダメ、80オーケー

という具合に、a=0 のときにオーバーになった460と310は確認しなくて良い。


これでだいぶ早くなり、通る。


前から確認していっても同じような感じに出来る気もするんだけど、

あんまり奇麗に作れなかったんで、やっぱり後ろからが良いのかも。

上手いこと考えるよねぇ、ほんとに。







atcoder.jp



勉強用コード
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))


というのを利用してみたのだが、時間が間に合わない。


そこで、
f:id:penyooo:20200628091724p:plain
縦に集計していたのを止めて、

f:id:penyooo:20200628091813p:plain
横に集計する、等差数列の和の公式でいける。

項数が q = n // i

初項 i 、項数 q 、末項 q × i で、

s += q*(q*i+i) // 2 という訳だ。 



いや、難しいわぁ。

C問題 も D問題 も他の人が提出したのを見ても何をしてるかわからなくて、

だいぶ悩んでしまった。これを時間内に自分で思い付くのはキツイ。

精進致します。







atcoder.jp



atcoder.jp



C問題、D問題の時点で厳しかったのでパス!!