我花了一些时间研究这个问题,但仍然无法解决或提出一个不错的解决方案。
到目前为止,这就是我所得到的,并不多。第二个测试用例对我来说真的没有意义
function solution(N, K) {
let startingBet = 1
if(K === 0) {
return N -startingBet
}
}
答案 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));