シュートをトリガーしてジャックポットを保護する


23

ゲームショーに参加します。課題の1つは次のように機能します。

  • 最初の部屋には、多数の同一のボールが含まれています。
  • 2番目の部屋には、一連のシュートがあり、各シュートには、ボールがいくつ置かれたかを数えるセンサーがあります。シュートに置かれたボールは回収できません。
  • 各シュートは、一定数のボール(トリガーカウント)が投入された後にトリガーされます。トリガーされると、ライトが点滅し、ノイズが発生し、トリガーしたことは間違いありません。
  • N次のチャレンジに進むには、シュートをトリガーする必要があります。
  • トリガーのカウントは知っていますが、カウントとシュートの対応はわかりません。
  • 最初の部屋から2番目の部屋にボールを移動する1つの機会があります。ボールをシュートに入れると、それ以上ボールを取り戻すことはできません。
  • あなたが取る各ボールは、ジャックポットからお金を差し引きます。

明らかに、あなたはあなたが挑戦に合格することを確実にしたいが、大当たりのお金の損失を最小限に抑えたい。プログラム、関数、動詞などを書いて、必要なボールの数を教えてください。

トリガーカウントが2、4、および10で、通過するために2つのシュートをトリガーする必要があるとします。10個のボールを渡す戦略があります。最初のシュートに最大4個のボール、2番目のシュートに最大4個のボール、3番目のシュートに最大4個のボールを配置します。3つのシュートの1つは2つのボールだけでトリガーするため、合計10を使用するだけです。10未満で動作することが保証されている戦略はないため、正しい出力になります。

入力

入力は、整数トリガーカウントの配列と、トリガーするシュートの数を示す整数で構成されます。どちらの順序でも2つの入力を取ることができ、必要に応じて、配列の長さで3番目の入力を取ることができます。

すべての入力がゼロよりも大きく、トリガーする必要があるシュートの数がシュートの数を超えないと仮定できます。

また、回答で明確に述べている限り、カウントがソートされている(昇順または降順)と想定することもできます。

出力

出力は、最適な戦略に必要なボールの数を示す単一の整数でなければなりません。

テストケース

フォーマット: N counts solution

1 [2 4 10] 6
2 [2 4 10] 10
3 [2 4 10] 16
1 [3 5 5 5 5 5 5 5 5 5] 5
2 [1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 8 11] 8
2 [1 2 6 6 6 6 6 6 6 10] 16
2 [1 2 3 3 4 4 6 6 6 11] 17
3 [1 2 3 4 5 5 6] 16
3 [2 4 7 7 7 7 7 7 7] 21
5 [1 2 2 3 3 3 3 3 5 9 9 11] 27
2 [5 15 15] 25
1 [4 5 15] 10
3 [1 4 4 4] 10
2 [1 3 4] 6
2 [1 3 3 8] 8

警告:忍者にしようとしないでください!
エリックアウトゴルファー

1
最後のテストケースが10を与える理由を説明してください。少なくとも1つのトリガーを確実に行うために、それぞれに少なくとも4つは配置しないでください。私はおそらくあまりにも愚かで、質問を十分に読んでいませんでしたが、理解できません。
ミスターXcoder

2
@Rod 1つがトリガーされることが保証される前に、2つのうち5つだけを配置する必要があります。5* 2 = 10
H.PWiz

3
@ H.PWizありがとう 課題は、はるかに....今複雑なようだ
氏Xcoderを

1
@ Mr.Xcoder、はい、しかしあなたは最悪の場合に成功することを確信しなければなりません。
ピーターテイラー

回答:


4

Python、222 198バイト

def S(G,P,T=0):
 T=T or[0]*len(P);r=[0]*(sum(t>=p for t,p in zip(T,P))>=G)
 for i,t in enumerate(T):
    if t<max(P):a=next(p for p in P if p>t)-t;T[i]+=a;r+=[a+S(G,P,sorted(T))];T[i]-=a
 return min(r)

使用法はS(2, (2, 4, 10))です。

このプログラムを適切な速度でテストするには、関数定義の後にこれを追加してメモ化を追加します。

old_s = S
mem = {}
def S(G, P, T=0):
    k = (G, tuple(P), T and tuple(T) or 0)
    if k in mem: return mem[k]
    r = old_s(G, P, T)
    mem[k] = r
    return r

各シュートに投入したボールの数、最初はすべてゼロを含む配列Tで動的プログラミングを行います。厳密な証明を提供することなく、Tを常にソートできる、つまり常に最後のシュートに最も多くのボールを投げると仮定します。

その後、T(問題の入力である)の要素に一致する要素が少なくともG(これが目標)の要素よりも大きい場合、解決策が見つかり、0をスローする必要があるため0を返します。より多くのボールが解決策を見つけます。これは、Gが1の場合、シュートに投入される最小のボールには、最小のシュート要件と同じかそれ以上のボールが含まれている必要があることを意味します。

それ以外の場合、各ポジションに対して、次のシュート要件にアップグレードするのに十分なボールを投入し(その間にあるものは観察できなくなります)、再帰します。次に、これらの再帰呼び出しの最小値を返します。


削除して215バイトcontinue
ミスターXcoder


4

ハスケル、124 117 100 98 91 80 78バイト

@Peter Taylorのおかげで11バイト節約

0#_=0
n#a=minimum$zipWith(\x y->x*y+(n-1)#(snd.splitAt y$a))a[1..length a-n+1]

オンラインでお試しください!

(#)引数として整数と整数のリストを降順で受け取ります

使用法は 1#[10,4,2]

説明:

リスト内の位置i(1-idexed)の各値xについて、その要素(またはx以下のいくつかの要素)を削除する最善の方法は、x個のボールをiシュートに注ぐことです。

リスト内の位置iの各要素xについて、(n#)は位置iを超えるリストのx * i +((n-1)#)を計算します(nが0になるまで)。その後、チェックされたすべての可能性の最小値を取ります。



2

Python、73バイト

f=lambda n,c:n and min(c[i]*-~i+f(n-1,c[-~i:])for i in range(len(c)-n+1))

H.PWizのHaskellポートの回答。入力は降順である必要があります。


1

CJam(35バイト)

{:A,,e!f<{$__(;A,+.-\Af=.*1bz}%:e<}

オンラインデモ

入力が昇順でソートされN countsているcountsと想定して入力を受け取ります。

解剖

カウントを降順で1インデックスの配列として示しますC(したがって、の2番目の要素Cは2番目に大きいカウントです)。シュートをトリガーすることで勝つとしましょうC[a_0], C[a_1], ... C[a_{N-1}]。その後、最悪の場合、それぞれのシュートにC[a_i]少なくともC[a_i]ボールを入れまし1a_i。だから我々は置くC[a_{N-1}]にボールをa_{N-1}シュート、追加的C[a_{N-2}]にボールa_{N-2}にそれらの、...

Nカウントの各サブセットで、最小の合計が得られますか?次に、カウントのそのサブセットで勝つことを目指してください。

NBコードは実際にはカウントを昇順で使用しますが、降順の方が直感的だと思います。

{         e# Define a block
  :A      e#   Store the sorted counts as A
  ,,e!f<  e#   Get all N-element subsets of A's indices
  {       e#   Map over these subsets S:
    $__   e#     Sort the subset and get a couple of copies
    (;A,+ e#     Remove the first element from one copy and append len(A)
    .-    e#     Pointwise subtraction, giving [S[0]-S[1] S[1]-S[2] ...]
    \Af=  e#     Get the counts [A[S[0]] A[S[1]] ...]
    .*    e#     Pointwise multiplication
    1bz   e#     Sum and take absolute value, giving the worst case score
  }%
  :e<     e#   Select the minimum worst case score
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.