0.はじめに
正月気分もすっかり抜けた今日この頃。
今回はABはすぐにできましたが、C問題から難問。
WAを繰り返しながらも何とか回答し、Dに取り組みましたが
あえなく時間切れ。
3問正解だったのでちょっとだけレートは上がり、+2の750と微増でした。
1. A - Octave
小手調べ的な問題。
ローカルテスト時に最初Yを2乗して出力して間違ってしまいましたが
修正して無事ACとなりました。
https://atcoder.jp/contests/abc440/submissions/72342347
2.B - Trifecta
順位を調べる問題。
リストTを元にリストの値と位置をタプルにしたリストを作り
ソートして先頭から3つを表示とし、ACとなりました。
https://atcoder.jp/contests/abc440/submissions/72346248
3.C - Striped Horse
C問題にしては難しい気がしましたが、なんとか解けたからそれほどでも
なかったのかな・・・といった問題。
どうにも問題文がすんなり入ってこなかったので
テストケースを元にあれこれ考えなんとか理解しました。
【考え方】
・目的はマスをWマス毎に白と黒にしていくこと
・正整数Xにより、白マス黒マスの起点が変わる
・塗る範囲=求めるコストの範囲はWマス毎
・i%2Wが同じなら色は同じ
・各マスのコストを先頭から2W個のリストに集計する
(マスiのコストはリストのi%2W番目に集計)
・上記集計リストの連続するWマスの値の合計が
最も少ない=コストが少なくマスが塗れることとなる
・ただし、リストの末尾と先頭を含むWマスのケースもある
【実装】
1.最大値INF(float('inf'))を定義
2.Tを入力
3.以下T回繰り返し
-1.N,W,リストCを入力
-2.W2にW×2をセット
-3.NがW2で割り切れる場合MにNを
割り切れない場合はMにNからNをW2で割った余りを引きW2を足した値をセット
(MはN以上最小のW2の倍数)
-4.先頭からW2個毎の列のコストをセットするリストLを0で定義
-5.Xを0からM+1まで増加させるループ
-1.XがNより小さい時、L[X%W2]にC[X]を加算
(XがCの範囲を超えるた場合は0が加算されるイメージ)
-6.変数ansにINFをセット
-7.blk(W個の連続するマスのコスト値)に0をセット
-8.iを0からW2+Wを増加させるループ(+Wは末尾から先頭へ黒マス範囲が掛かっているケースのため)
-1.iがWより小さい時blkにL[i%W2]を加算
-2.iがW以上の時
-1.ansにansとblkの小さい方をセット(i-1の時点のWマスのコストの判断)
-2.blkからL[i-W]をマイナス
-3.blkにL[i%W2]を加算
4.ansにansとblkの小さい方をセット(ループ最終値の判断)
5.ansを出力して終了
なかなかややこしかったですが、時間内に解けてほっとしました。
https://atcoder.jp/contests/abc440/submissions/72370349
以上