第5話CのほうがBより難しい件

はい、今回も競プロに参加してきました。

まずA問題ですが案外安直な方法で解けました。時間制限に引っかかるかなと思いつつ、1問目で無駄に時間をかけても仕方ないので失敗上等でソースコードを投げました。

今回の計算量はリストを一回頭から最後まで舐めていき、最小値を得るところが一番の不安でした。

念のためPythonから実行環境をPyPyというやや早く動く環境で投げたところ無事AC、要するに正解だと判断されました。ここはきちんと分かったんですよね。


そしてB問題に取りかかったわけですが……問題の意味がよく分かりませんでした、どういう解放を採ればいいのかもさっぱり分かりません。ここで手が止まったので早々にB問題は諦めてC問題に移りました。

時々BよりCの方が簡単ということはあるのですが、今回は見事その予想が当たりました。


C問題はおそらくですが愚直に解くなら時間制限に引っかかる問題でした。


まず全探索を試みたのですが上手くいきません、時間を考えるとどうやっても失敗するでしょう。そこでふと思いました、『以前この問題やったな』と。


いえ、某ゼミの事ではありません、以前解いた問題は与えられた数列に重複する数が存在するか判定しろというものでした。


で、そこで私はハッキリ言えばズルをしました、いや、言語の標準機能を使っただけなのでズルとはいえないのですが、Cなどのデータ構造が標準でついていない言語には無い機能を使って解きました。


やり方は至ってシンプルで、数列を全て読み込み、それを一個一個setに突っ込むという方法でした。なんとPythonには標準で重複のない集合を作れるんですよ。

普通にリストに突っ込んだものと、集合に突っ込んだものを用意して、len(ans)で同じ長さなら重複はないとして解きました。


さて、今回のC問題は文字列が何種類あるかを問うものでした。

これは応用出来るなと判断したので条件と一致したものを集合に突っ込んでいきました、便利なことにset()で作った集合は文字列でも突っ込めるんですよ。


そして重複した文字列でなければ集合に追加という方法で書き、最後にlen(word)をかければ集合の長さ、つまり何種類の文字列が入っているかを求められます。


なお、チキンなのでこれもPyPyで投げました、計算上はO(2n)で求められると判断したのですが、あまり自分のことを信じていないので取れる小細工を全て使用して審査にかけました。


その甲斐あってか無事ACを頂けたわけですが……今日の問題を解いて一つ思いました。


俺がすごいんじゃねえ! Pythonを作った皆さんが優秀なだけじゃねえか!


はい、たまたま言語仕様と問題が合致したから解けただけですね、実力ではないのでもう少し頑張ろうと思いました。


なお、そんなことをしてもレートは結構上がりました。結果しか見られないというのはとてもいいことですね!

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る