れとろのメモ置場

とあるSEのメモ置場

エクサウィザーズプログラミングコンテスト2021(AtCoder Beginner Contest 222)

エクサウィザーズプログラミングコンテスト2021に参加しました。

結果

A,B,C,Dの4問正解でパフォーマンスが987でした。 最近D問題が解けてて、パフォーマンスが緑~水色あたりだからレーティングが少しずつ上っていって嬉しい。

A - Four Digits

問題文のとおりに出力する。
解説を見てからだと自分の回答はめんどくさい解き方してるなと思う解き方をしてた。 数字を文字列として受け取りリバースする。その後0000を後ろに追加して、先頭から4文字の部分文字列を取得する。最後に取得した部分文字列を再度リバースして出力する。

出力時に先頭0埋めでいいなら%04dだけでよかった。 先頭0埋めの文字列をその後加工するなら今回提出した処理の方が良いんだけど、出力するだけだからなあ…

B - Failing Grade

問題文の通りに出力する。
P点未満の点数がいくつあるかを数えて出力するだけ。

C - Swiss-System Tournament

いろいろ解き方がありそうな問題。

誰が何回勝ったかを数えておく。ソート関数で使う用に、数えている記録を元に2人の順位の上下をboolで返す関数を作成した。 こうすると各ラウンドで全員がじゃんけんした後に、自作した順位判断基準の関数を利用して1~2Nをソートすると順位通りに並ぶようになる。 Mラウンド分 じゃんけん→ソート を繰り返した後に1~2Nのソート結果を先頭から順に出力すればOK。

D - Between Two Arrays

DPを使って解く問題だった。
DP[i][j]を c _ {i}をjとする場合に作成可能な数列の個数 とすると、 a _ {i} \leq c _ {i} \leq b _ {i}の時は DP[i][j] =  \Sigma ^ {a _ {i} } _ {j=0} DP[i-1][j]  要するにD[i-1][0]からD[i-1][j]までの累積和になる。a _ {i} \leq c _ {i} \leq b _ {i}じゃない時はDP[i][j]=0になる。 後はこれをi=1から順番に計算していけば良い。
ただ、毎回累積和を計算するのは制約的にTELになりそうなのでO(1)くらいで求められるようにしておく。 私はDPを計算する際に合わせて累積和も計算していた。j=0から順番にDPを処理しているからj-1までの累積和にDP[i][j]を足すだけでjの時の累積和が計算できる。これをj=3000までやるとj=0~3000すべての累積和が計算できている。