ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC084

バチャコン5回目です(4回目は復習回でした)。

A - New Year

提出コード
12月30日のn時から年が明けるまでにどれくらい時間がかかるか、という問題です。
12/31の一日分まるまる24時間+今日の残り時間(24-n)を出力します。
12/31の分は、問題を読み間違えていてもサンプルを見れば気づくはずです。

B - Postal Code

提出コード
文字列を受け取り、forループで

  • A+1文字目が ' - '

  • それ以外が ' 0 ' ~ ' 9 '

でなかった場合、答えをNoと出力するように、bool型なりなんなりを用いて答えを記録します。ループが終わったら、答えを出力しましょう。

C - Special Trains

提出コード
一瞬、MujinコンのE問題のようなメモ化を考えましたが、なくても高速で求めることができるので全く必要ありませんでした。
それぞれのスタートの駅から、O(N)で答えを求めます(つまり最終的にはO(N^{2})となります)。
現在のスタートからの時間をtとし、i番目の駅にいるとします。そして、次のような操作を施します。

  1. t \lt s_iならば、s_iまで待つ(t=s_iとする)

  2. tf_iの倍数でなければ、tに一番近いf_iの倍数にする
    具体的には、t=[\frac{t}{f_i}+1]×f_iとします。c++上での割り算と同様、端数は切り捨てます。

  3. 移動分の時間を足します。t=t+c_iとします。

  4. 1~3を、N番目の駅にたどり着くまで繰り返します。

また、N番目の駅からN番目の駅に行くまでにかかる時間はもちろん0なので、それについては最初に出力してしまっていいでしょう。

D - 2017-like Number

エラトステネスの篩です。素数の問題なのでとりあえずふるいました。
ふるいおわったら、3から2刻みで、求める個数の累積和を計算していきます(3からにしたのは、配列の参照場所の関係です)。
前処理が終わったら、クエリに答えていきます。
1~nまでの、条件を満たす数の和をsum[n]とすると、l、rが与えられたとき求める数は
sum[r]-sum[l-2]
になります。
2つおきでしか累積和の計算をしていない場合、クエリに答えるときも2つ前の要素を参照するように気を付けましょう。


というわけで、無事に30分以内に全完することができました!!
本番もこれぐらいすんなりいってみたいですね…