こんにちは, Shinoryoです.
今回はユニークビジョンプログラミングコンテスト2023 春 (AtCoder Beginner Contest 300)を, Pythonで解いてみた結果を書き連ねていこうと思います.
ユニークビジョンプログラミングコンテスト2023 春 (AtCoder Beginner Contest 300) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
A - N-choice question
$A + B$を求めて, $C$の中にそれと一致するものが存在するかを調べればよいです. for
文を用いて次のように実装できます.
あるいは, リストのメソッド.index()
を用いて, リストの要素のインデックスを取得することもできます. インデックスと選択肢の番号は$1$ずれていることに注意してください.
B - Same Map in the RPG World
「$s$回縦方向シフトしたあとの$A$」と「$s + H$回縦方向シフトしたあとの$A$」が一致することや, 「$t$回横方向シフトしたあとの$A$」と「$t + W$回横方向シフトしたあとの$A$」が一致することから, $H$回以上の縦方向シフトや, $W$回以上の横方向シフトを考える必要はありません. 純粋に全シフトパターンを確かめても, 少ない計算量で済みます.
numpy
のnp.roll()
を用いれば, 配列をシフトさせたものを簡単に取得することができます.
あるいは, numpy
を用いずに, 配列のシフトを実装しても良いです.
さらに, 配列のシフトを実装するのではなく, $A$と$B$が一致しているかを調べるところで, $A$の要素のインデックスをずらしていくだけで十分です. $s$回縦方向シフトして$t$回横方向シフトした$A$と$B$を比べるときは, A[(i + s) % H][(j + t) % W]
とB[i][j]
を比較すればよいのです.
C - Cross
一つひとつの#
マスに対して, その周囲のマスが#
であるかどうかを愚直に調べていくことで, 解くことができます.
あるいは, #
マスがバツ印以外には使われていないことを利用して, #
が何マス連結しているかを調べていくことでも, この問題を解くことができます.
例えば, Union Findを用いて実装することができます. 最初は1つひとつバラバラな要素が用意されます. そして, 「2つのまとまりをつなげる」という操作を繰り返し, 最終的にある要素がどの集合に属しているかを管理していくアルゴリズムです.
Union Findは, AtCoder Beginner Contest 214をPythonで解くのD - Sum of Maximum Weightsでも登場しています.
AtCoder Beginner Contest 214をPythonで解く
こんにちは, Shinoryoです. 今回は AtCoder Beginner Contest 214 を, Pythonで解いてみた結果を書き連ねていこうと思います. AtCoder Beginner Contest 214 - AtCoder AtCoder is...
D - AABCC
$N \leq 10^{12}$であるので, $c$の最大値は
を解いて$c = 288675$と得られます. ゆえに, $a$, $b$, $c$の取りうる数の一覧表として, まず$288675$までの素数のリストを取得する必要があります. これはEratosthenesの篩を用いることで得ることができます. Eratosthenesの篩は数学などでよく知られた手法ですが, 例えば以下のサイトをご覧ください(外部).
エラトステネスのふるいとその計算量 | 高校数学の美しい物語
エラトステネスのふるいのアルゴリズムと具体例を解説. 計算量を導出し,愚直な素数判定の方法と比較します.
Pythonでは例えば以下のように実装できます. 整数$n$を与えると, その整数以下の素数のリストを返す関数です.
後は, $a = 2$, $b = 3$, $c = 5$から順番に, 問題文の条件に適している個数をカウントしていくだけです. 三重ループになりますが, ループの途中で適切にbreak
を挟むことで, TLEにならずにACすることができます. 公式解説では一番深いところのbreak
だけで済むという記述がありますが, Pythonではおそらく全てのループで適切なbreak
を挟まないとTLEになります(間違えていたら申し訳ございません).
E以降
E以降は私の能力不足故に省略いたします.
参考にしたサイト等
- 「解説 - ユニークビジョンプログラミングコンテスト2023 春 (AtCoder Beginner Contest 300)」
Editorial - ユニークビジョンプログラミングコンテスト2023 春 (AtCoder Beginner Contest 300)
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
- nkmk様による「Pythonのリストの要素のインデックス(何番目か)を取得」
Pythonのリストの要素のインデックス(何番目か)を取得 | note.nkmk.me
Pythonのリスト(配列)の要素のインデックス, つまりその要素が何番目に格納されているかを取得する方法について, 以下の内容を説明する. リストの要素が重複していない場合: index() リストの要素が重複している場合: index(), enumerate(), リスト内包表記 タプルのインデックスを取得 最大値・最小値のインデックス(位...
- nkmk様による「NumPy配列ndarrayをシフト(スクロール)させるnp.roll」
NumPy配列ndarrayをシフト(スクロール)させるnp.roll | note.nkmk.me
NumPyの関数np.roll()を使うとNumPy配列ndarrayをシフト(スクロール)させることができる. 配列の開始位置をずらすときなどに使う. numpy.roll — NumPy v1.16 Manual ここでは以下の内容について説明する. np.roll()の基本的な使い方 二次元配列(多次元配列)の場合 画像処理への応用(画像をスクロール) 一次元配列を...
- nkmk様による「PythonでのUnion-Find(素集合データ構造)の実装と使い方」
PythonでのUnion-Find(素集合データ構造)の実装と使い方 | note.nkmk.me
PythonでのUnion Findデータ構造(素集合データ構造)の実装とその使い方を説明する. まずはじめに最終形のクラスとその使い方のサンプルコードを示し, 後半で素朴な実装からいくつかの工夫を加えて最終形に至るまでを説明する. Union Find(素集合データ構造)の概要 PythonでのUnion Findの実装例 サンプルコードのクラス...
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)