2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选相关的知识,希望对你有一定的参考价值。

2022-03-09:我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。
如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。

答案2022-03-09:

容易想到二分法,但二分法是不对的。
递归或动态规划。
只有1个数字的时候,返回0。
只有两个数字的时候,选小的。
大于等于3个数字的时候,每一个都试一下。

代码用golang编写。代码如下:

package main

import "fmt"

func main() 
	ret := getMoneyAmount2(1000)
	fmt.Println(ret)


func getMoneyAmount2(n int) int 
	dp := make([][]int, n+1)
	for i := 0; i < n+1; i++ 
		dp[i] = make([]int, n+1)
	
	for i := 1; i < n; i++ 
		dp[i][i+1] = i
	
	for L := n - 2; L >= 1; L-- 
		for R := L + 2; R <= n; R++ 
			dp[L][R] = getMin(L+dp[L+1][R], R+dp[L][R-1])
			for M := L + 1; M < R; M++ 
				dp[L][R] = getMin(dp[L][R], M+getMax(dp[L][M-1], dp[M+1][R]))
			
		
	
	return dp[1][n]


func getMax(a, b int) int 
	if a > b 
		return a
	 else 
		return b
	


func getMin(a, b int) int 
	if a < b 
		return a
	 else 
		return b
	


执行结果如下:


左神java代码

以上是关于2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选的主要内容,如果未能解决你的问题,请参考以下文章

LintCode 666. 猜数游戏 II

1536 不一样的猜数游戏

Python猜数小游戏

BZOJ 2222: [Cqoi2006]猜数游戏神奇的做法,傻逼题,猜结论

从猜数游戏到二分查找算法

猜数字大小