0.はじめに
今年最後のコンテストに臨む今日この頃。
A~Cは順調に正解したもののいつも通りDでブレーキ。
解き方のアプローチが違うことを認識しつつ粘ったけど
あえなく時間切れ。
それでもA~Cの回答速度が速かったためか、+2の744と微増で2025年を終えました。
1. A - First Contest of the Year
どんな星でも1週間は7日なのかなと思いつつ解答。
【考え方】
・年の日数Dから初回日Fをマイナスした値X(初回以降その年が残っている日数)を求める。
・Xを7で割った余りY(その年最後の回のあと、その年が残っている日数)を求める。
・7からYを引いた数が、翌年初回日の日となるので出力して終了
https://atcoder.jp/contests/abc438/submissions/71996962
2.B - Substring 2
B問題なのであまり効率を考えず素直に実装。
【実装】
1)変数N,M、リストでS,Tを入力
2)答え用変数ansを10の18乗で初期化
3)TとSを比較する位置をループ(インデックスiを0~N-M+1でずらす)
-1)3)のループ内で回答用回数を保持する変数nansを0で定義
-2)一文字ずつ比較するループ(インデックスjを0~M-1でずらす)
-1)nansにS[i+j]とT[j]を一致するために必要な手数を加算
・ -1)関数chk(s,t)
-1)sがt以上の時、s-tを返す
-2)sがtより小さい時、10からt-sをマイナスした値を返す
-3)ansにansとnansの小さい方をセット
4)ansを出力して終了
https://atcoder.jp/contests/abc438/submissions/72011933
3.C - 1D puyopuyo
なんとなく似たような問題をやった気がしたのでその時の記憶を起こしながら
実装してみました。
【考え方】
・消していく順番で結果は変わらない
・消す数は常に4
・先頭から値を見ていき、値とその連続数をスタックしていく
・4つ並んだらNから4マイナスし、スタックの後ろから連続している値と個数を継続する
【実装】
1)変数N、リストAを入力
2)デキューq(値とその値が連続している個数の組を保持)を初期化
3)X(継続している値)にA[0]をセット
4)Y(継続している個数)に1をセット
5)ans(回答用変数)にNをセット
6)リストを先頭から参照するループ(iを1からN-1まで1ずつ増加)
-1)A[i]がXと同じとき
-1)Yに1加算
-2)A[i]がXと異なるとき
-1)qに(X,Y)を追加
-2)XにA[i]、Yに1をセット
-3)Yが4の時(消去処理)
-1)ansから4減算
-2)qが空でない時
-1)qの最後から取り出し、X,Yに格納
-3)qが空の時
-2)X,Yに0を格納
7)ansを出力
意外にすんなり解けました。
https://atcoder.jp/contests/abc438/submissions/72018337
以上