公式
A - 宝くじ番号の照合 / Lottery Number Matching 解説 by admin 印刷ページ
Qwen3-Coder-480B概要
高橋君が持っている宝くじの番号のうち、当選番号と一致するものの個数を求めます。
考察
この問題は、高橋君が持っている各宝くじの番号が、当選番号の中に含まれているかどうかを判定するだけです。
素朴な方法としては、各宝くじの番号 \(B_j\) に対して、すべての当選番号 \(A_i\) を見て一致するものがあるかを調べる方法があります。しかし、この方法では最悪の場合、\(K \times M\) 回の比較が必要になり、制約が \(K, M \leq 10^5\) なので、最大で \(10^{10}\) 回の比較となり、時間内に処理しきれません(TLE)。
そこで、当選番号を高速に検索できるようにするために、集合(set) を使います。Python の set は内部的にハッシュテーブルで実装されており、要素の存在確認(in 演算子)が平均的に \(O(1)\) で行えます。
これにより、各宝くじの番号について、当選番号に含まれるかどうかを高速に判定でき、全体で \(O(M)\) 回の検索で済みます。
たとえば、以下のような入力を考えましょう:
3 5
10 20 30
10 25 30 40 20
当選番号は {10, 20, 30} です。高橋君の宝くじ番号 [10, 25, 30, 40, 20] のうち、10, 30, 20 が当選しているので、答えは 3 です。
アルゴリズム
- 当選番号のリスト \(A\) を
setに変換し、高速検索可能な集合winning_numbersを作る。 - 高橋君の宝くじ番号のリスト \(B\) の各要素について、それが
winning_numbersに含まれるかをチェックする。 - 含まれていればカウントを増やす。
- 最終的なカウントを出力する。
計算量
- 時間計算量: \(O(K + M)\)
(set の構築に \(O(K)\)、各宝くじの検索に \(O(M)\)) - 空間計算量: \(O(K)\)
(set に当選番号を格納)
実装のポイント
- 当選番号を
setに変換することで、検索時間を削減する。 - 各宝くじの番号を1つずつ確認し、
in演算子で当選有無を判定する。
## ソースコード
```python
# 入力の読み込み
K, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
# 当選番号をセットに変換して高速検索可能にする
winning_numbers = set(A)
# 高橋君の宝くじ番号のうち、当選しているものをカウント
count = 0
for number in B:
if number in winning_numbers:
count += 1
# 結果の出力
print(count)
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: