12月2日 作業日誌 ABC258
こんばんは。
諸事情によりまだ11月だと言い張りたいのですが流石にタイトルには嘘をつけませんでした。
ABC258を解いた
例によって競技プログラミングの過去問です。
今回はCまで挑戦しました。
A
21:00に与えられた分数を足して時間を出力する問題でした。
与えられた時間を60で割って21に足し、60で割った余りをくっつけて、って感じで無事解けました。
B
正方形のマス目がありそれを移動して、八方向に直線移動したマスの数字を順に並べて一番大きいものを出力、という問題でした。
マス目の端に着いたら某RPGのように反対側へループします。
スタートを全てのマスで全探索しました。
そこまでは良かったのですが、八方向の移動について8つfor文書いてしまいました。
解けたのは良かったですが書くのに時間がかかるしデバッグ大変だしで改善の余地ありですね。
解説を見たら方向を配列で持っておけば楽とのことでした。
あれこれゲーム制作でやってるじゃんってなったので次は使えると思います。
C
与えられた文字列の最後を取って最初に入れたり(以下、操作と呼ぶ)指定された場所の文字を出力したりする問題でした。
毎回操作してるとTLEになるので操作をする回数を持っておき、文字を出力する時に計算するという方法でいく、というところまでは良かったのですが。
いざ書いてみるとどうしてもREが出て解けませんでした。
結局他の方の解答を見て、微妙に書き方を修正して通しましたが何故良くなったのかがわかりませんね……。
とりあえず「配列を操作する問題で操作を保持しておく時、配列の大きさをオーバーするかどうかは操作の計算が一通り終わってからにする」と理解しておきます。
文章化難しいですね……。
解説作っている方々尊敬します。
以上です。