0.はじめに
今回は全体的に難易度が高かった感じでした。
結局D問題はACできずレート-10で終えました。
1.A - Similar String
いつものスマートに行きそうな気もするけどめんどいので
SとTを一文字ずつ比較し、似た文字列の条件の組を数えて
文字数と一致したらYesを出力と、実装しました。
後で、解説よんでも同様の解き方でした。
ユーザー解説の方は0をoに1をiに置き換えて判断と
いく分スタイリッシュな解き方が書いてありました。
https://atcoder.jp/contests/abc303/submissions/41730540
2.B - Discord
Bの割に難易度高くなーい?と思いつつ解いたら意外と早く解けました。
隣合わせの組をキーにして辞書登録して、最後に全組み合わせについて
辞書にあるかをチェックする形で実装しました。
実装
1.NとMを読み込み、初期化した辞書dictとansを用意する
2.リストを1行ずつリストAに読み込む
2-1.リストAを、0~N-2までのインデックスで順に読み込む
2-1-1.pにA[i]とA[i-1]の小さい方をセット
2-1-2.qにA[i]とA[i-1]の大きい方をセット
2-1-3.str(p)+str(q)をキー、値1を辞書に登録
3.インデックスiを1~N-1まで繰り返す
3-1.インデックスjをi+1~Nまで繰り返す
3-1-1.str(i)+str(j)をキーに辞書を検索
3-1-1-1.辞書にない場合にansに1を加算
4.ansを表示
実装時に3-1-1.の部分でわざわざiとjの大小を気にしてしまいましたが
今考えると、i<jは保証されてるなと思いました。
https://atcoder.jp/contests/abc303/submissions/41740355
3.C - Dash
ややこしい問題でした。
実装方法は悩みましたが、高度な数学的知識とかは不要で
TLEも考慮しないでよい問題でした。
考え方
・アイテムの場所は辞書で管理。
・キーはB座標を文字列として結合
・使用したかどうかは、辞書登録時に値を1にしつかったら0にしておく
・文字列に従って、主人公の座標を動かしていく
・動かした時点でHPを減算し、-1だったらNoを出力して終了
・HPが0異常なら、アイテムがあるかを辞書検索し、ある且つ値が1だったら
HPを回復
・最後まで移動出来たらYesを出力して終了
意外とすんなり実装できましたが、WAが4つ発生。
悩んでいろいろ確認していたら、アイテムを使用した後に値を0にする
ロジックで、=を書くところが、==になっていて、値が膿和が枯れて
いませんでした。
これのせいで30分近くロスしてしまいました・・・・。
https://atcoder.jp/contests/abc303/submissions/41762897
4.D - Shift vs. CapsLock
なんとなくDPかとは思いつつ、以下の考えで実装。
aが連続している場合、capsを押して、shift+aと押さないでaの
どちらが時間がかからないか・・・
といった形で、連続したa or Aに応じて
capsを押すかを判定・・・という実装をしました。
結果はWAが2個と、意外と惜しい感じではありましたが
おそらくこのWAをつぶすためにDPを導入しないと
いけないんだろうなと思います・・・。
そのうちリベンジするかも。
以上