A〜Cに回答できました.Dまで回答したいところでした.
- A - Div
- B - Palindrome with leading zeros
- C - Compass Walking
- D - Send More Money
- E - Unique Color
- F - Cube
A - Div
$N$個の○の間に|を入れる方法の数=$N-1$.B - Palindrome with leading zeros
$N$は最大9桁なので,ゼロを先頭に0~9つけたうえで文字列を反転させて比較すればよい.文字列Aを反転させる方法はA[::-1]
C - Compass Walking
最短距離は$d=\sqrt{X^{2}+Y^{2}}$.直線で$r$より小さくなる1歩前まで近づいて,最後の2歩でぴったりになるよう調整すればよい.つまり($d\geq r$のとき)
- $d$が$r$で割り切れる場合:「$d/r$の商」
- $d$が$r$で割り切れない場合:「$d/r$の商-1+2」
math.ceil(d/r)
とかける.
$d < r$のときが例外で2歩となる.
D - Send More Money
文字列をsetに入れて,全ての場合を生成して判定すれば良いところまではわかりました.ポイントは次です.①1つめを見落としていた,②処理が遅くTLEとなったことから時間内に回答できませんでした.【ポイント】
- $N_{i}^{\prime}$は正で$S_{i}$の文字列に等しい$\Leftrightarrow N_{i}^{\prime}$の1文字目$\neq$0.
- $S_{1},S_{2},S_{3}$に含まれる文字種は$10\,(0\sim 9)$以下.
例えば,次がわかりやすい:Submission #21649960 - AtCoder Beginner Contest 198
E - Unique Color
グラフのことを知らなすぎて,コードを読んでもわかりません.→2021.04.24:蟻本で隣接リストの使い方を学んで,理解できるようになりました(Pythonで蟻本2-5 - グラフ - 競プロはじめました).
参考になるコードにコメントを加えて書き直しました.
# https://atcoder.jp/contests/abc198/submissions/21656222 import sys sys.setrecursionlimit(500005) n = int(input()) c = list(map(int, input().split())) g = [[] for _ in range(n)] for i in range(n-1): a, b = list(map(int, input().split())) g[a-1].append(b-1) g[b-1].append(a-1) def dfs(cur, pre, g, f, c): """ current(現在地), previous(前いた点), graph(隣接リスト), f(経路上にあった色) c(各頂点の色リスト) """ if f[c[cur]] == 0: ans.append(cur+1) f[c[cur]] += 1 # 前いた頂点を除く隣接頂点でdfs # 最短経路で最も早く各頂点の色が記録される # →最短でない場合は上のifで落ちる for e in g[cur]: if e != pre: dfs(e, cur, g, f, c) # dfsから出ていく(頂点curから出ていく)ときは # 経路上の色リストから消す f[c[cur]] -= 1 ans = [] dfs(0, -1, g, [0]*(100001), c) ans.sort() for v in ans: print(v)
これも気になります:Submission #21651950 - AtCoder Beginner Contest 198