ABC123に参加しました
はじめに
結果から言うとABCの3完でした
久しぶりのABCでした(ABCがある日に友達と遊んでいた)がCまでAC出来たので素直にうれしかったです
今回は問題文をよく読まなかったせいでA問題に少し手間取ってしまいました
以下僕の解法です
A問題
太字になっている直接の意味が分からず、例題の解説もA問題だからとロクに読まなかったため、初めは「入力の前後のアンテナの距離がk以下」であればいいのかなと思い組んでみたら例2で引っ掛かり、よくよく解説を読んでみると「全てのアンテナ間の距離がk以下」ということでした
問題文はちゃんと読みましょう
ということで僕はvectorを使ってアンテナの位置を配列に落とし込んで2重ループ使って、1つ目のアンテナと2つ目のアンテナの距離、1つ目のアンテナと3つ目のアンテナの距離……途中で間の距離がkを越えたら":("を出力という風にしました
B問題
入力を全部足したら見えてくると思いますが、答えは「入力された値+α」なわけです(当たり前ですが)
じゃあその+αってなんやねんって考えると、10に対する各入力の1の位の補数を足したやつがそれっぽくなってくるわけです
これは10の倍数の時刻でしか注文できないので、下一桁がなんであれ〇0分まで待たなくちゃいけないからですね
でもそのまま足すだけだとちょっとはみ出します
じゃあ何が余分なのかというと、最後に注文するものの「後の」待ち時間が必要ありません
入力例1の場合はAPCラーメンの後の待ち時間の5分が必要ないわけです
この最後に注文するものを何にするかで時間が変わってきます
最短にしたい場合は上で述べた補数が1番大きいものを選べばよいですね
ここまでを踏まえて入力例1を考えてみると、とりあえず入力を全部足す(211)→補数を足す(220)→APCラーメンの分はいらないので引く(215)
という風になります
注意すべきは10に対する0の補数は10ですが、0の時待ち時間なしで注文できるので下一桁が0のときは0を足します
結局のところ、入力が10で割り切れたら0を、それ以外なら10-入力÷10をそれぞれ待ち時間の配列に入れてその中でソートして一番大きい奴だけ抜いて答えに足してやればいいです
C問題
32bit整数型に収まらない時があるとか言われているので素直にlong long int にします
問題の考え方としては一番乗れる人数が少ない交通機関を主にして考えます
砂時計みたいに上に一杯砂が溜まっていても下に落ちる口が小さければ、全部が落ちるまでに時間がかかります
同じように考えると、例え100人乗っても大丈夫なバスがあっても1人しか乗れない船があれば都市6までその船で全員を運ぶ分時間がかかるわけです
そうやって考えてゆくと入力例1の場合は初め3人で行っても2人(入力の中で一番小さい数)で行ってもかかる時間は変わりません
ですから最終的には n / min(a, b, c, d, e) を切り上げてやった数に+4してやった時間が答えです
D問題
時間中に解けなかったのですがまた余裕があれば書きたいです
終わりに
僕は愚直にしかできませんが、もっとおしゃれな解法があると思うので探してください
いい感じに伸びてくれました
今回はC問題がかなり簡単だったんじゃあないかなと思いました(Dももう少し時間があれば解けたかもしれない……)
3月さぼったせいで春休み中に茶色行けてません!
何もしないこととの格闘が重要になってきます
また過去問を解いたり螺旋本をしたりして精進していきます
稚拙な文章でしたがここまで読んでくださりありがとうございました