Atcoder-ABC219をpythonで解いてみた
目的
- Atcoderで上を目指すべく頑張っている中でABC219を解いたので、解説してみる
- pypy7.3を使って解いている
A問題
考察
- 問題文通りに解けば良い
実装
X = int(input()) if X < 40: print(40-X) elif 40 <= X and X < 70: print(70-X) elif 70 <= X and X < 90: print(90-X) else: print("expert")
結果
B問題
考察
- 問題文通りに解けば良い
実装
S1, S2, S3 = input(), input(), input() T = input() ans = [] for t in T: if t == "1": ans.append(S1) elif t == "2": ans.append(S2) else: ans.append(S3) print(*ans, sep="")
結果
C問題
考察
久々にC問題で取りこぼして2完に
- X進数の変換の要領で、26進数と見なして数値化して、文字列を数値化してsortした
- WAが取れずに、だいぶ焦ってしまって、自分を見失ってしまった・・・
- この辺見る感じ、文字列を数値化してsortするというのでなく、文字列ごとに比較してsortする感じのようだ
- この辺りは、時間とって改めて深ぼってみたい
独自の辞書順のものを、通常のアルファベット順に直し、sortしたのちに、戻すのが簡単そう
- あっさり解けた
- sortを独自で作るのとかはなかなかハードル高い
実装
X = list(input()) N = int(input()) tmp, ans = [], [] for _ in range(N): S = input() string = [chr(97 + X.index(s)) for s in S] tmp.append("".join(string)) tmp.sort() for i in range(len(tmp)): s = tmp[i] string = [X[(ord(c)-97)] for c in s] ans.append("".join(string)) print(*ans, sep="\n")
結果
D問題
考察
DPであることはすぐに気づいたが、DPが組み立てられず、時間切れ
- 下記の方針を2本を考えた
- i個目の弁当を考え、j個のたこ焼き、k個のたい焼きを考える
- 3重ループになって大変そう?
- 弁当を取るかどうか?の話なので、DPの値をtupleで持ってみる?
- たこ焼き、たい焼きのそれぞれをどのように更新するかのロジックが組めず・・・
- i個目の弁当を考え、j個のたこ焼き、k個のたい焼きを考える
素直に3重ループで解けた
- 1sちょっとで、時間はかかるが、時間内に解けた
実装
N = int(input()) INF = pow(10, 9) X, Y = map(int, input().split()) dp = [[[INF] * (Y+1) for _ in range(X+1)] for _ in range(N+1)] dp[0][0][0] = 0 for i in range(1, N+1): A, B = map(int, input().split()) for j in range(X+1): for k in range(Y+1): x, y = min(j+A, X), min(k+B, Y) dp[i][x][y] = min(dp[i][x][y], dp[i-1][j][k]+1) dp[i][j][k] = min(dp[i][j][k], dp[i-1][j][k]) ans = dp[-1][X][Y] if ans == INF: print(-1) else: print(ans)
結果
まとめ
- 今回2完で、大きくレートを落とした・・・
- 腐らず、また頑張っていこうと思う
- 今回のが悔しかったので、Educational DP Contestの問題を、解き進めてDPの理解を深めた
- まだまだ歴が浅く、苦手が出るとrateを大きく落とすことがあるので、都度見つけたら重点的に弱点を補強して行きたい
I問題まで解いた
- いろんなDPを組むパターンを覚えて、応用できるようにしたい
Educational DP始めた!https://t.co/O9pL2z2Te9 #Atcoder #Python #競技プログラミング #DP #動的計画法
— オ-℃ (@kazu_kun0716) 2021年9月20日
Educational DP 2問目も解けたhttps://t.co/mWDh1drtEe
— オ-℃ (@kazu_kun0716) 2021年9月20日
Educational DP Cも解いた https://t.co/zvLodan8IN
— オ-℃ (@kazu_kun0716) 2021年9月20日
Educational DP Dも解けた https://t.co/aienlNYGuD
— オ-℃ (@kazu_kun0716) 2021年9月21日
default dictの初期値設定できるの知った
— オ-℃ (@kazu_kun0716) 2021年9月21日
知らなかった頃の俺https://t.co/MMHgL3Y2k7
知った俺https://t.co/mLrmmB9Uje
そして、DPで二次元の情報とか使う難しくなるのでアンチパターン感あるな
Educational DP F むずかったなー
— オ-℃ (@kazu_kun0716) 2021年9月23日
dp計算したのちに、逆から復元するのとか勉強になった
dpに答えそのものを使わない場合もあるhttps://t.co/ggNZCDTNIt
Educational DP G
— オ-℃ (@kazu_kun0716) 2021年9月23日
トポロジカルソートした後に、これどう経路数えればいいか分からない問題whttps://t.co/g0ykj7yquR
ナルホド
---
トポロジカルソートとは、すべての頂点u,vu,vについて
u≠vu≠v かつ R(u,v)R(u,v) ならば uu が vv よりも先に現れるように頂点を一列に並べることです。
--- pic.twitter.com/55EuJDMAZs
Educational DP H
— オ-℃ (@kazu_kun0716) 2021年9月23日
スルッと解けたので、自分でもびっくりhttps://t.co/X6AmPDKOUr
Educational DP I
— オ-℃ (@kazu_kun0716) 2021年9月24日
地味にむずくて苦戦したhttps://t.co/OM1r0HM8TX
誤差嫌だなーと思ってDecimal使ったら壮絶に遅かったのは良い知見https://t.co/NbAIz88lMv