Pythonでk人の労働者を雇うための最小コストを見つけるためのプログラム
異なるワーカーごとにqualityという配列があり、wagesと値Kという別の配列があるとします。i番目のワーカーには、quality[i]と最低賃金期待賃金[i]があります。有給のグループを形成するためにK人の労働者を雇いたい。 K人の労働者のグループを雇用する場合、次の規則に従って彼らに支払う必要があります。
-
有給グループの各労働者は、有給グループの他の労働者と比較することにより、質の比率で支払われるべきです。
-
有給グループのすべての労働者は、少なくとも最低賃金の期待を支払わなければなりません。
上記の条件を満たす有料グループを形成するために必要な最小限の金額を見つける必要があります。
したがって、入力が品質=[10,22,5]、賃金=[70,52,30]、K =2のような場合、最初の労働者に70を支払い、 3人目の労働者。
これを解決するには、次の手順に従います-
-
qr:=新しいリスト
-
品質と賃金からの各ペア(q、w)について、実行します
-
qrの最後に(w / q、q)を挿入します
-
-
リストを並べ替えるqr
-
cand:=新しいリスト、csum:=0
-
0からK-1の範囲のiの場合、実行
-
-qr [i、1]をヒープカンドに挿入します
-
csum:=csum + qr [i、1]
-
-
ans:=csum * qr [K-1、0]
-
Kから品質のサイズまでの範囲のidxについては、実行してください
-
-qr [i、1]をヒープカンドに挿入します
-
csum:=csum + qr [idx、1]+ヒープカンドの最上位要素をヒープから削除します
-
ans =ansの最小値および(csum * qr [idx] [0])
-
-
ansを返す
例
理解を深めるために、次の実装を見てみましょう
import heapq def solve(quality, wage, K): qr = [] for q, w in zip(quality, wage): qr.append([w/q, q]) qr.sort() cand, csum = [], 0 for i in range(K): heapq.heappush(cand, -qr[i][1]) csum += qr[i][1] ans = csum * qr[K - 1][0] for idx in range(K, len(quality)): heapq.heappush(cand, -qr[idx][1]) csum += qr[idx][1] + heapq.heappop(cand) ans = min(ans, csum * qr[idx][0]) return ans quality = [10,22,5] wage = [70,52,30] K = 2 print(solve(quality, wage, K))
入力
[10,22,5], [70,52,30], 2
出力
105
-
Pythonでスティックをカットするための最小コストを見つけるためのプログラム
値nとcutsという配列があるとします。長さn単位の木の棒があると考えてください。スティックには0からnまでのラベルが付いています。ここで、cuts [i]は、カットできる位置を表します。順番にカットする必要がありますが、カットの順番は自由に変更できます。ここで、1カットのコストはカットするスティックのサイズであり、合計コストはすべてのカットのコストの合計です。削減の最小総コストを見つける必要があります。 したがって、入力がn =7、cuts =[5,1,4,3]の場合、出力は16になります。これは、[3,5,1,4]のように注文すると、最初に長さ7から3なので、コストは7です。次に、長さ3
-
Pythonですべてのポイントを接続するための最小コストを見つけるためのプログラム
(x、y)の形式のいくつかの点を持つpointsという配列があるとします。ここで、2つのポイント(xi、yi)と(xj、yj)を接続するコストは、それらの間のマンハッタン距離であり、式は| xi--xj|です。 + | yi--yj|。すべてのポイントを接続するための最小コストを見つける必要があります。 したがって、ここでの合計距離は(6 + 5 + 3 + 8)=22です。 これを解決するには、次の手順に従います- points_set:=範囲0からポイントのサイズ-1までの数値を保持する新しいセット ヒープ:=ペア(0、0)でヒープを作成します visited_node: