0.はじめに
問題的にはどれもちょうどよい歯ごたえで
Dまでギリギリ解け、心地よい達成感が得られました。
レートアップを期待しましたが、+5と微増にとどまりました。
1.A - Water Station
いろんなやり方ありそうだなと思いつつ
以下の実装。
Nに0~4を加算していき、5で割り切れるまでの回数(距離)と
Nから1~4を減算していき、5で割り切れるまでの回数(距離)を
比較して小さい方の距離の値を回答として出力。
https://atcoder.jp/contests/abc305/submissions/42129905
2.B - ABCDEFG
A~Gの各距離をリストにしてーと考え始めましたが
どうせ何かをリスト登録しないといけないならと
A~Gのスタートからの距離を辞書登録して
絶対値を求めるというすっきりした実装にしました。
dict={"A":0,"B":3,"C":4,"D":8,"E":9,"F":14,"G":23}
p,q=input().split()
print(abs(dict[p]-dict[q]))
https://atcoder.jp/contests/abc305/submissions/42134737
3.C - Snuke the Cookie Picker
最初質問の意味がピンときませんでしたが
入力例を見て分かりました。
要は"."の上下左右の4方のうち、2方向が"#"であれば
食べた跡だなと気づき、そのように実装しました。
https://atcoder.jp/contests/abc305/submissions/42139441
4.D - Sleep Log
1時間以上かけてやっとクリアできました。
初めは、0~リストの最後の数までそれまでの睡眠時間を
保存して~と、試してみましたがさすがに10の9乗は
TLEだしメモリオーバーでした。
うすうす2分探索しないといけないんだろうなと思い
その線で再挑戦。
まずは、リストAと、値Bを渡すと
値Bがリストにある場合はそのアドレスをint型で
ない場合は、値B前後のアドレスをtuple型で
返す関数find_rangeを作成。
次にリストAを元に、記録開始時刻から、リストの各値毎までの
総睡眠時間を持つリストspを作成
あとは、Q毎に、
R時点までの開始からの総睡眠時間※から
L時点までの開始からの総睡眠時間※を引いて出力
で実装しました。
※R(L)時点までの開始からの総睡眠時間の求め方
find_rangeに、リストAとR(L)を渡す。
・戻り値が、int型resultの時
sp[result]が総睡眠時間
・戻り値が、tuple型start,endの時
・startが偶数の時・・L(R)時点では起きている
起床後の状態=総睡眠時間はstart時点から
増えないのでsp[start]が総睡眠時間
・startが奇数の時・・L(R)時点では寝ている
・Lの時
sp[start]に、sp[start]~Lまでの睡眠時間を足した値
が総睡眠時間
・Rの時
sp[end]から、R~sp[end]までの睡眠時間を引いた値
が総睡眠時間
書いててもややこしいので時間がかかり、ギリギリで
ACとなりました。
https://atcoder.jp/contests/abc305/submissions/42163267
以上