freee プログラミングコンテスト2023(AtCoder Beginner Contest 310)に参加しました。
結果
A,B,Cの3問正解でした。
D,E問題がさっぱり分からなかった。
E問題は数学っぽい問題だなあと思って、数式をいじって計算量減らせないか考えてみたけどだめだった。
A - Order Something Else
P円でドリンクを飲むか、割引価格のQ円+円を支払ってドリンクを飲むのとで1番安い支払金額を出力する問題。
問題文の通り最小値を探して出力すれば解ける問題。
の最小値を探して、の最小値+QとPのうち小さい方を出力すれば良い。
B - Strictly Superior
問題文通りの条件を満たすペアが存在するかどうかを答える問題。
条件が色々あって面倒だけど全組み合わせに対して3つの条件1つ1つを丁寧に確認していって出力すれば良い。
3つの条件それぞれにフラグを用意して全部trueの場合があるかどうかを判断すれば正解できる。
3つの条件を満たすものが1つでもあればYesを出力して探索を打ち切って良いので、
各条件を確認しつつ、満たされていない条件が出てきた時点でその組み合わせの探索は打ち切れば多少は無駄な処理が減らせると思う。
C - Reversible
N個の文字列が与えられて、最初から一致する場合もひっくり返して一致する場合も同じ文字列とする時に、何種類の文字列があるかを答える問題。
何種類あるかを答えれば良いのでsetに入れていってサイズがどれくらいかを答えれば解けそうだなと最初に思った。 ひっくり返して一致する場合も同じ文字列とみなすので1つ文字列を受け取ったら、そのままverとひっくり返したverをsetに入れていき、最後にsetのサイズを2で割れば良いと思った。
ただこの場合だと1文字だけの文字列がいくつかあるとうまく処理できないので、
一旦2文字以上用の集合と1文字だけの集合を用意して、2文字以上用の集合のサイズ/2+1文字だけの集合のサイズを答えてみた。
問題なさそうな気がするけどWAになったので別の解き方を考えることにした。
文字列を受け取った時に、もともとの文字列とひっくり返したあとの文字列を比較して辞書順で小さい方だけをsetに入れていき、最後にsetのサイズを答えるようにしてみた。
この方法ならちゃんとACできた。最初の方法でも問題ないと思うんだけどなあ。
E - NAND repeatedly
全然解けなかった問題。
0,1からなる文字列を与えられるので指定された計算式でNANDをひたすら計算していくような問題。
NANDの結果は2項とも1のときだけ0になるので0と1の数や並び方で答えが導出できそうな気がしたけど法則っぽい何かは見つけられなかった。
総和を計算するので式を展開していじって見たら簡単な数式にならないかなと思ったけどそれもだめっぽかった。