如何解决这个赌博问题?

时间:2019-09-23 03:31:41

标签: javascript arrays algorithm

我花了一些时间研究这个问题,但仍然无法解决或提出一个不错的解决方案。

到目前为止,这就是我所得到的,并不多。第二个测试用例对我来说真的没有意义

function solution(N, K) {
  let startingBet = 1
    if(K === 0) {
      return  N -startingBet 
    }
  }

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

让我们回溯。我们假设约翰已经参加了他的巡回赛,然后我们尝试“退步”他采取的步骤。

最简单的情况是n === 0,在这种情况下,他打了0回合。我们可以称其为基本情况。

对于其他所有情况,如果n是偶数,则John可以全力以赴,在这种情况下,n被加倍,因此我们将其除以返回。我们还降低了k

  solution(N / 2, k - 1)

无论如何,他也可以打赌,那就是:

  solution(N - 1, k)

如果有两种情况,solution将返回到目前为止每种步骤的最小步骤数,获得最小的步骤,再添加一个步骤(对于当前步骤)并返回。

您可能会注意到,这很慢,记住可能会有所帮助。否则您可能会开始寻找一种模式...

答案 1 :(得分:0)

问题是:

如何从一个芯片升级到N个芯片?

您将使用2种方式增加筹码,要么在一轮中赢得1,要么在一轮中将筹码数量加倍。

但是,您可以加倍筹码的次数受K限制。

因此,让我给出一个更详细的示例:

1.-您从一张筹码开始,必须达到100筹码,而赢得双倍筹码的次数是3。

所以:

N = 100
K = 3

因此,您有很多方法可以从1到100。

您可以赢得99回合,并通过1比1赢得100回合。

但是,他们要您以最少的回合数达到要求的数量。 AND ,您受到筹码翻倍3的次数的限制。

所以最好的解决方案是:

从一个芯片开始。
赢11回合,每回合赢1筹码,直到获得12筹码。
加倍筹码,现在有24筹码。
再赢一轮,下注1筹码,您现在有25筹码。
筹码翻倍,您现在有50。 筹码翻倍,您现在有100。

因此,总共需要最少15轮才能从1到100筹码,最多将您的筹码翻倍3倍。

答案 2 :(得分:0)

解决方案非常简单:如果N为偶数,则每个步骤要么将N除以2(并减小K),或者仅将N除以1。当没有余数时(K <1或N <4),只需添加N-1个步骤:

function solution(N, K) {
  let result = 0; // or: result = -1;
  while (N > 3 && K > 0) {
    if (N % 2) {
      N -= 1;
    } else {
      N /= 2;
      K -= 1;
    }
    result += 1;
  }
  return result + N - 1; // or: return result + N
}

console.log(solution(8, 0));
console.log(solution(18, 2));
console.log(solution(10, 10));

它也可以递归形式重写:

function solution(N, K) {
  if (K < 1 || N < 4)
    return N - 1;

  return 1 + (N % 2 ? solution(N - 1, K) : solution(N / 2, K - 1));
}

console.log(solution(8, 0));
console.log(solution(18, 2));
console.log(solution(10, 10));