Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで紙幣の両替にかかる最短時間を求める方法


問題の概要

n人のレジ係が紙幣の両替業務を行っているとします。現時点で、i番目のレジ係の前には k[i] 人のお客様が並んでおり、その列に並ぶ j 番目のお客様は m[i,j] 枚の紙幣を持っています。ここで求めたいのは、自分の紙幣の両替が最も早く完了するのはどのレジ係なのか、その最短時間です。ただし、次の条件があるものとします。

  • レジ係が1枚の紙幣をスキャンするのに 5秒 かかる
  • 1人分の紙幣のスキャンが完了した後、両替処理に 15秒 かかる

例として、入力が n = 6、k = [12, 12, 12, 12, 12, 12] の場合を考えてみましょう。

7897961099678
10710989999656
9889867910667
769669896689
98765108107668
876579796557

この場合の出力は 585 になります。各レジ係はお客様の紙幣1枚ごとに5秒かけてスキャンするため、「5 × m[i,j]」を加算します。さらに、レジ係はお客様1人につき15秒を要するため、「15 × k[i]」も合計に含めます。こうして各レジ係の所要時間を計算し、そのうち最小の値が答えとなります。この例では、インデックス5のレジ係(m[5])が最短の585秒となりました。

解決のための手順

この問題は、以下のステップで解くことができます。

  • n := k のサイズ

  • minimum := 99999(十分に大きい値で初期化)

  • i を 0 から n-1 まで繰り返す:

    • temp := k[i] × 15

    • j を 0 から k[i]-1 まで繰り返す:

      • temp := temp + m[i][j] × 5

    • もし temp < minimum ならば:

      • minimum := temp

  • minimum を返す

このアルゴリズムの計算量は O(総紙幣枚数) であり、非常にシンプルかつ効率的です。

実装例

理解を深めるために、以下のPythonでの実装を見てみましょう。

def minTimeToExchange(k, m):
    n = len(k)
    minimum = 99999
    for i in range(n):
        temp = k[i] * 15
        for j in range(k[i]):
            temp += m[i][j] * 5
        if temp < minimum:
            minimum = temp
    return minimum

k = [12, 12, 12, 12, 12, 12]
m = [
    [7,8,9,7,9,6,10,9,9,6,7,8],
    [10,7,10,9,8,9,9,9,9,6,5,6],
    [9,8,8,9,8,6,7,9,10,6,6,7],
    [7,6,9,6,6,9,8,9,6,6,8,9],
    [9,8,7,6,5,10,8,10,7,6,6,8],
    [8,7,6,5,7,9,7,9,6,5,5,7]]
print(minTimeToExchange(k, m))

入力

[12, 12, 12, 12, 12, 12],
[[7,8,9,7,9,6,10,9,9,6,7,8],
[10,7,10,9,8,9,9,9,9,6,5,6],
[9,8,8,9,8,6,7,9,10,6,6,7],
[7,6,9,6,6,9,8,9,6,6,8,9],
[9,8,7,6,5,10,8,10,7,6,6,8],
[8,7,6,5,7,9,7,9,6,5,5,7]]

出力

585

  1. Pythonで色のマージ後に残る最小個数を求めるプログラム

    問題概要 赤(R)、緑(G)、青(B)の3種類の色からなるリストを考えます。隣り合う異なる2つの色は、残りの「第3の色」1個に変換(マージ)できます。この変換を好きな順序で何度でも繰り返してよいとき、最終的に残る要素数の最小値を求めるのがこの問題です。 たとえば入力が colors = [G, R, G, B, R] の場合、次のように変換を進めることで最終的に1個まで減らせます。したがって出力は 1 となります。 解き方のアプローチ 一見すると状態探索が必要そうな問題ですが、実はXOR(排他的論理和)を使ったシンプルな判定だけで答えが求まります。手順は以下の通りです。 n := 色リス

  2. Pythonでn×mの長方形内に配置できる2×1サイズの長方形の個数を求める方法

    問題概要2つの整数 n と m が与えられたとき、サイズ n × m の長方形の内部に、サイズ 2 × 1 の小さな長方形を最大いくつ配置できるかを求めます。ただし、以下の条件を満たす必要があります。どの2つの小さな長方形も互いに重なってはならない。すべての小さな長方形は、大きな長方形の内部に完全に収まっていなければならない。ただし、外側の長方形の辺に接することは許容される。入力例たとえば、n = 3、m = 3 の場合、出力は 4 になります。3×3のマス目には、2×1の長方形(ドミノ)を4つ配置でき、残りの1マスだけが空きとなります。解き方のアプローチこの問題は、面積の考え方と偶奇の判定を