Pythonで全員を救出するために必要なロケット船の最小数を求めるプログラム
問題の概要
人々の体重を表す数値のリスト weights と、1台のロケット船に許容される重量制限を示す値 limit が与えられているとします。各ロケット船には最大2人までしか乗せることができません。このとき、全員を惑星へ救出するために必要なロケット船の最小数を求めるのが課題です。
たとえば、入力が weights = [300, 400, 300]、limit = 600 の場合、出力は 2 になります。これは、体重300の2人を1台目のロケット船に乗せ、体重400の人を2台目のロケット船で運ぶためです。
解決のためのステップ
この問題は「貪欲法(グリーディ法)」を用いることで効率的に解けます。具体的には、以下の手順に従います。
リスト
weightsを昇順にソートするカウンタ
cnt := 0を初期化するweightsが空になるまで、以下を繰り返すx := weightsの末尾の要素(最も重い人)を取り出すweightsが空でなく、かつweights[0] <= limit − x(先頭の最も軽い人が同乗できる場合)ならば、weightsの先頭の要素を削除するcnt := cnt + 1とする
cntを返す
なぜこの手法が有効か
最も重い人を必ず1人乗せたうえで、可能であれば最も軽い人をペアとして同乗させることで、各便の積載容量を無駄なく活用できます。この戦略により、必要なロケット船の総数を最小化できます。
実装例(Python)
理解を深めるために、以下のPythonコードをご覧ください。
class Solution:
def solve(self, weights, limit):
weights.sort()
cnt = 0
while weights:
x = weights.pop()
if weights and weights[0] <= limit - x:
weights.pop(0)
cnt += 1
return cnt
ob = Solution()
weights = [300, 400, 300]
limit = 600
print(ob.solve(weights, limit))
入力
[300, 400, 300], 600
出力
2
-
Pythonで数の因子の最小合計を求めるプログラム|素因数分解の考え方
本記事では、与えられた整数について、積が元の数と等しくなる因子の組み合わせの中から合計が最小となる値を求める方法を、Pythonのコード例とともに解説します。 問題定義 入力として1つの整数が与えられます。この数を複数の因子の積として表したとき、因子の合計が最小になるケースを求めてください。 すべての因子の組み合わせを網羅的に調べて合計を比較する方法もありますが、実はもっとシンプルで効率的なアプローチが存在します。 考え方:素因数の合計が最小になる 鍵となるのは次の性質です。積が一定の値になるとき、因子の合計が最小になるのは、すべての因子を素数まで分解した場合(素因数分解した場合)です。
-
【Python】ある数の最大の素因数を求めるプログラムの書き方
この記事では、「与えられた整数の最大の素因数を求める」という問題に対する解決方法を、具体的なコード例とともにわかりやすく解説します。 問題文 正の整数 n が与えられたとき、その数の最大の素因数を求めます。 例えば n = 15 の場合、15 は 3 × 5 と素因数分解できるため、答えは 5 となります。 解き方のアプローチ 入力された数を、小さい約数から順番に割っていくことで素因数分解します。 割り切れるたびに、その時点での約数(素因数)を「最大値」として更新していきます。 平方根まで調べれば十分なため、計算量を抑えられます。 実装例(サンプルコード) import math def