れとろのメモ置場

とあるSEのメモ置場

AtCoder Beginner Contest 338

AtCoder Beginner Contest 338に参加しました。

結果

A,B,Cの3問正解でした。

D問題とE問題どちらとももうちょっと頑張れば解けそうな気がする難易度だった。 結局時間内には解けなかったので後で解説を確認して復習しておきたい。

A - Capitalized?

英字の文字列が与えられるので、先頭の文字だけが大文字となっているかどうかを判定する問題。

文字列を1文字ずつ切り出せて、その文字が大文字か小文字かを判定する方法を知っていれば解ける問題。 文字列とか文字の扱いに慣れていれば苦労しないくらいの難しさだと思う。

B - Frequency

文字列が与えられるので最頻出の文字を答える問題。

文字列から1文字ずつ取り出して、各文字が何回出てくるかを正しくカウントできれば解ける問題。
文字数のカウントは連想配列を使うなり、要素数26個の配列を用意してaからの何文字離れているかを要素番号にして数えていくなりやり方は色々ありそう。

C - Leftover Recipes

N種類ある材料がそれぞれQ _ {i}グラムある。 2種類の料理があって、1人前分はどの食材をどれくらい使うか与えられるので最大で何人前の料理を作れるか答える問題。

はじめは幅優先探索でそれぞれ何人前作れるか探索してみたけど、サンプルケースの時点で時間がかかりすぎていた。 なので別の解き方を考えることにした。 片方の料理の作る数を固定すると、もう一方の料理がどれくらい作れるかは残りの食材のグラム数から簡単に求められる。 なので、片方の料理は最大でいくつ作れるか計算して、0個から計算した最大値の範囲で、 もう一方の料理がいくつ作れるかそれぞれに計算していき、最大何人前の料理が作れるのかを計算して求めた。

一方の料理は最大でどれくらい作れるのかは簡単に計算できることに気づいたので、 片方は線形探索しつつ、もう一方は高速に算出していけば制約を考慮しても間に合いそうだなと思ったので上記の方針で解くことにした。