くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

AtCoder Beginner Contest 172 参加ログ・感想


内容

  • Python3でやっている。
  • 参加ログ。
  • 所感。
  • コンテスト中に何を考えたか。
  • コンテスト後に解説をみたり、少し整理したりしたくらいの内容。
  • 問題の詳細で細かく書こうと思うものは別記事とする。
  • E以上はとりあえず現状自力では無理なのでDまで。解けるようになってきたら更新するかも

結果

6分ちょいでAB2完。自分の中では順調。
そこから、40分程度Cに取り組むが最適なを求めにいって失敗。
さらに、残りDに取り組むが約数の数え方を愚直にやろうとして失敗。


どう考えたか + α

A - Calc

問題タイプ:式記述
単純に{\displaystyle a + a^2 + a^3} をそのまま書いて終わり

a = int(input())
ans = a + a**2 + a**3
print(ans)

B - Minor Change

問題タイプ:文字列indexアクセス(文字列の何文字目かへのアクセス)

わかりやすくやるために、{\displaystyle S, T}共にリストで読み込み。 あとは、enumerateでインデックスと値を返してあげて一致しなかったらカウントするとした。

s = list(input())
t = list(input())
cnt = 0
for idx, i in enumerate(s):
    if i != t[idx]:
        cnt += 1
print(cnt)

でも文字列はリストに入れなくても、s[i]などとすればi+1文字目を取得でき、実際に文字列はiterableである。(簡単に言えばfor文でinの後ろに持ってこられる) 複数のiterableを同時に扱いたいときにはzip()を使うほうがスマートだった。

S = input()
T = input()   
cnt = 0
for s, t in zip(S, T):
    if s != t:
        cnt += 1
print(cnt)

さらに、リスト内包表記で書くとTrue, Falseが返ってくるのでいちいちカウントせずにsumすればいい

S = input()
T = input()
ans = sum([s != t for s, t in zip(S, T)]) 
# [False, True, False, True]のような形で返ってきているものをsumするとTrueをカウントできる
print(ans)

C - Tsundoku

問題タイプ:しゃくとり法 or 累積和+二分探索

解けなかった。貪欲と勘違いしたが、それではダメと気づいたがどうやっていいかを発想できなかった。しゃくとり法や累積和+二分探索でやればいいということで、きちんと頭整理して別記事でまとめたい。

追記:

blacktanktop.hatenablog.com


D - Sum of Divisors

問題タイプ:約数の個数をどう数えるか

解けなかった。少し前に約数列挙を覚えたばっかだったので、なんとなくできそうと思ったが、約数列挙してても間に合わない。効率よく「約数の個数」を数える必要がある。きちんと頭整理して別記事でまとめたい。

追記:

blacktanktop.hatenablog.com


おわりに

当面の目標は、ABC完答できればDまでだが、まだまだ基本的な整数問題を適切なアルゴリズムで解くというところが甘い。まだ始めたばかり思って、精進に励むことにする。