LoginSignup
2
1

0.はじめに

 なかなかバラエティに富んだ問題がそろってました。
BにてこずったりDに絶望しつつ、Eがなんとか解けたため
レートはなんとかプラス+15と増えました。

1.A - Adjacent Product

 小手調べ的な問題。
回答用のリストBを用意し、リストA内の隣接した数字を掛けたものを
Bに格納して表示するだけでACでした。

 https://atcoder.jp/contests/abc346/submissions/51545214

2.B - Piano

 めちゃくちゃてこずり、後回しにした上に考察が甘く
WAを3連発して時間を食われました。
【考え方】
 1.配列WL(鍵盤の白部分を1とした列[1,0,1,0,1,1,0,1,0,1,0,1]の繰返し)を用意
 2.配列BL(鍵盤の黒部分を1とした列[0,1,0,1,0,0,1,0,1,0,1,0]の繰返し)を用意
 3.変数WSを用意しWLを先頭から足していく、その際、BLも同じ位置分BSに足していく
 4.WSが入力Wと同じときのBSの値がBと同じなら、Yesを出力して終了
 5.Bと違う場合、先頭から1ずらして3~4を繰り返し
 6.12回繰り返してもBSの値がBと一致しない場合Noを出力して終了

1回目は、配列WLとBLが、W=100をみたすだけの長さが無かったためREに。
2~3回目は”WSが入力Wと同じとき”が、WL[i]=1の時と、その次が0の時の
2種類あることが考慮されていなかったためにWAとなりました。

 自分的にはB史上一番難しくない?と思う問題でした。

 https://atcoder.jp/contests/abc346/submissions/51581060

3.C - Σ

 普通にやったらTLEだろうなーという思いと普通にやる方法も結構複雑だなーと
いう感じでした。
 まぁ、典型的な問題なので、すぐ解法は思いつきました。
【考え方】
 1.1~Kまでの累積和KS((K*(K+1))//2)を計算
 2.リストA内のK以下かつ重複しない値を集計したASをKSからマイナスし出力
 ~ASの算出法~
 1.リストAに存在する数の辞書Dを用意
 2.リストAを先頭から見ていき、Dにある場合はスキップ
  Dにない場合、辞書Dに登録かつ、K以下ならASに加算

 といった感じですんなり解けました。  

 https://atcoder.jp/contests/abc346/submissions/51565374

4.Gomamayo Sequence

 DPだなーと思いつつどんな集積にすればよいかがおもいつかずスルーしました。
後で解説見ながら解きたいと思います。

5.E - Paint

 典型的な問題だったので、セオリー通り最後の操作優先で
算出する方法を検討。
のんびり考えてたら意外と時間が足りなくなりましたが
縦横の捉え違いとかもなく、テスト~提出まですんなりいけて間に合いました。

 【考え方】
 1.行列毎に塗られた順番と色を保持する辞書(WD,HD)を用意
 M回分インプットして、辞書を更新(既存行は上書き)
 2.WD,HDの値をリストLに(塗順,縦横,色)を格納し、降順に並べ替え
 3.縦加算数=Hと横加算数=W、SortedDict(Key_色:値_枚数)CDを用意する
 4.リストLを先頭から参照
 縦の場合、辞書CD_KEY色の値に縦加算数を加算、横加算数を1マイナス(0まで)
 横の場合、辞書CD_KEY色の値に横加算数を加算、縦加算数を1マイナス(0まで)
 縦加算数と横加算数が共に0になったらリスト参照終了
 5.CD内に0がある場合(0で塗られていた場合)CD[0]にWCHCを加算
  ない場合且つ、WC
HCが0でない場合(塗られていないマスがある場合)
 CD[0]にWC*HCをセット
 6.CDのキー・値を順に出力して終了

 https://atcoder.jp/contests/abc346/submissions/51604645

以上

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1