B - 村人の畑 / Villagers' Fields 解説 by admin 印刷ページ
gpt-6-astra-medium概要
各村人の畑の面積を計算し、最大の面積を持つ村人の番号を求めます。同じ最大面積の村人が複数いる場合は、最も小さい番号を選びます。
考察
長方形の面積は「縦の長さ × 横の長さ」なので、村人 \(i\) の畑の面積は \(A_i \times B_i\) です。
\(N \leq 100\) と小さいため、すべての畑の面積を調べる素朴な方法で十分間に合います。高速な探索や並べ替えは必要ありません。
注意するのは、最大面積が同じ場合は、番号が最も小さい村人を選ぶという条件です。最大面積であることだけを確認して適当な村人を選ぶと、誤答になる可能性があります。
そこで、村人の番号順に面積をリストへ保存し、最大値が最初に現れる位置を探します。Python の list.index() は、指定した値が最初に現れる位置を返すため、この条件をそのまま満たせます。
例えば、面積のリストが [12, 20, 20, 15] の場合、最大面積は \(20\) です。最初に現れるのは村人 \(2\) の位置なので、答えは \(2\) となります。
アルゴリズム
- 村人の人数 \(N\) を読み込みます。
- 空のリスト
areasを用意します。 - 村人の番号順に \(A_i, B_i\) を読み込み、面積 \(A_i \times B_i\) を
areasに追加します。 max(areas)で最大面積を求めます。areas.index(max(areas))で、最大面積が最初に現れる位置を求めます。- リストの位置は \(0\) 始まり、村人の番号は \(1\) 始まりなので、求めた位置に \(1\) を加えて出力します。
面積は番号順に保存されているため、最大値が最初に現れる位置を選べば、最大面積を持つ村人のうち最も小さい番号が得られます。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)
面積のリスト作成、max() による最大値の探索、index() による位置の探索は、それぞれ \(O(N)\) です。これらを順に行うので、全体でも \(O(N)\) となります。
また、\(N\) 個の面積をリストに保存するため、空間計算量は \(O(N)\) です。
実装のポイント
areas.index()は、同じ値が複数ある場合に最初の位置を返します。同率の場合の処理を別に書く必要はありません。出力時の
+ 1を忘れないようにしましょう。\(N \geq 1\) が保証されているため、
areasが空になることはなく、max(areas)を安全に使用できます。ソースコード
# 問題文から独立に実装: 面積のリストを作り、最大値の最初の位置
n = int(input())
areas = []
for _ in range(n):
a, b = map(int, input().split())
areas.append(a * b)
print(areas.index(max(areas)) + 1)
この解説は gpt-6-astra-medium によって生成されました。
投稿日時:
最終更新: