AtCoder Beginner Contest ABC404 解法メモ
文中で使用しているのは、PythonライクでAtCoderに最適な言語の1つNimです
ABC404
ABC404A - Not Found
解法
a~zを順に試し、最初に
Nimなら、
for i in 'a'..'z':
if i notin S: echo i; quit()
と書ける
ACコード
ABC404B - Grid Rotation
解法
初めに回転してから、塗り替えてもよいので、
回転は、
proc f(i,j,k:int):(int,int)=
if k==0: return (i,j)
f(N-1-j,i,k-1)
としておけば、
let (ni,nj)=f(i,j,k)
if S[ni][nj]!=T[i][j]: ai+=1
とすればよい
ACコード
ABC404C - Cycle Graph?
解法
サイクルグラフであることは、全ての頂点の次数がで2あって、連結であればよい(複数のサイクルを否定)
これは、Union-Findで、
u=initDSU(N)としておき、
u.merge(A,B)
d[A]+=1; d[B]+=1
としていけばよい
ACコード
メモ
想定誤解法ではないが、N==Mは不要
その上、わざわざ0からスタートしてBFSで本当に一周できるか、などと無駄なことをしてTLE&WA
ABC404D - Goin' to the Zoo
解法
各動物園に行く回数が
最大
よって、
for i in 0..<3^N:
var
n=i
id=0.repeat(N)
var j=0; while n>0: id[j]=n mod 3; n=n div 3; j+=1
とすればよい
初めに、「動物
「動物園
後は先程の
ACコード
メモ
各動物園に行く回数(
ABC404E - Bowls and Beans
解法
豆を複数の茶碗にわけ入れることに意味はなく、後ろから
今、一番右の茶碗から入れられる範囲の中に、次に豆の入った茶碗があれば、その茶碗にすべての豆を入れてしまえばよい(いずれにせよ、その
次に豆の入った茶碗がなければ、「その次の移動で一番左まで入れられる範囲を広げられる茶碗」に入れるのが最善である
各々を操作
実装としては、
popLastした茶碗位置
-
以上のpeekLastの茶碗があったら、そこを次のl として豆を入れるr - そうでなく、
であれば、l\leqq 0 (ゴール)r=0 - それでもなければ、その次に進める範囲が最も左となる茶碗の位置を
にしていけばよいr
メモ
後ろから、一箇所に、は直感的にわかったが、パスをとりながらBFSといった、グラフでのアプローチに固執してしまった
次の茶碗を探す前に、
Discussion