news 2026/4/16 9:47:34

UVa 11843 Guessing Game

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 11843 Guessing Game

题目描述

Alice \texttt{Alice}AliceBob \texttt{Bob}Bob设计了一个双人猜数游戏。游戏开始前,他们约定两个正整数:范围N NN允许的失误次数上限S SSAlice \texttt{Alice}Alice秘密选择一个整数X XX0 ≤ X < N 0 \le X < N0X<N),然后Bob \texttt{Bob}Bob轮流猜测整数。对于Bob \texttt{Bob}Bob的每次猜测,Alice \texttt{Alice}Alice会给出以下三种回应之一:

  • strike \texttt{strike}strike:如果猜测的数字大于X XX
  • smile \texttt{smile}smile:如果猜测的数字小于X XX
  • stop \texttt{stop}stop:如果猜测的数字等于X XX(此时游戏结束,Bob \texttt{Bob}Bob获胜)。

如果Bob \texttt{Bob}Bob累计收到S SSstrike \texttt{strike}strike,则游戏结束,Alice \texttt{Alice}Alice获胜。

Bob \texttt{Bob}Bob希望在正式比赛前进行训练。他需要知道,对于给定的N NNS SS在最坏情况下,他需要多少次猜测才能确保猜中Alice \texttt{Alice}Alice选择的任意数字X XX,并且在此过程中他最多收到S − 1 S-1S1strike \texttt{strike}strike(否则他会输掉游戏)。

输入格式:第一行包含一个整数C CC,表示测试用例的数量。接下来C CC行,每行包含两个整数N NNS SS,分别表示数字范围和允许的strike \texttt{strike}strike次数上限。保证1 ≤ N ≤ 1000 1 \le N \le 10001N10001 ≤ S ≤ 20 1 \le S \le 201S20

输出格式:对于每个测试用例,输出一行一个整数,表示Bob \texttt{Bob}Bob在最坏情况下所需的最少猜测次数。

题目分析

这是一个典型的最坏情况下的最优策略问题,类似于带有限制的二分搜索。我们可以从以下几个关键点理解题目:

  1. 游戏目标Bob \texttt{Bob}Bob需要保证无论Alice \texttt{Alice}Alice选择哪个数字X XX,他都能在收到少于S SSstrike \texttt{strike}strike的情况下猜中。
  2. 策略限制:每次猜测如果得到strike \texttt{strike}strike,会消耗一次“允许的失误机会”;如果得到smile \texttt{smile}smile,则不消耗。
  3. 最坏情况:我们需要考虑在所有可能的X XX下,Bob \texttt{Bob}Bob所需猜测次数的最大值,并最小化这个最大值。

解题思路

1. 问题建模

d p [ n ] [ s ] dp[n][s]dp[n][s]表示当数字范围为[ 0 , n − 1 ] [0, n-1][0,n1](即共有n nn个可能的数字),且Bob \texttt{Bob}Bob最多还能承受s ssstrike \texttt{strike}strike时,在最坏情况下需要的最少猜测次数。

初始条件:
  • 如果没有数字需要猜(n = 0 n = 0n=0),则不需要猜测:d p [ 0 ] [ s ] = 0 dp[0][s] = 0dp[0][s]=0
  • 如果不能承受任何strike \texttt{strike}strikes = 0 s = 0s=0),那么Bob \texttt{Bob}Bob只能从最小的数字开始逐个猜测,最坏情况需要猜n nn次(当X = n − 1 X = n-1X=n1时):d p [ n ] [ 0 ] = n dp[n][0] = ndp[n][0]=n
状态转移:

假设当前范围大小为n nn,我们选择猜测位置k kk0 ≤ k < n 0 \le k < n0k<n)。猜测后有三种可能:

  1. 猜中:游戏结束,本次猜测计数为1 11
  2. 得到strike \texttt{strike}strike(猜大了):说明X < k X < kX<k,剩余范围大小为k kk,剩余可承受strike \texttt{strike}strike次数为s − 1 s-1s1,后续需要的最少猜测次数为d p [ k ] [ s − 1 ] dp[k][s-1]dp[k][s1]
  3. 得到smile \texttt{smile}smile(猜小了):说明X > k X > kX>k,剩余范围大小为n − k − 1 n-k-1nk1,剩余可承受strike \texttt{strike}strike次数仍为s ss,后续需要的最少猜测次数为d p [ n − k − 1 ] [ s ] dp[n-k-1][s]dp[nk1][s]

由于我们要保证最坏情况,所以对于固定的k kk,需要的猜测次数为:
guesses ( k ) = 1 + max ⁡ ( d p [ k ] [ s − 1 ] , d p [ n − k − 1 ] [ s ] ) \texttt{guesses}(k) = 1 + \max(dp[k][s-1],\ dp[n-k-1][s])guesses(k)=1+max(dp[k][s1],dp[nk1][s])
其中1 11表示当前这次猜测。

为了最小化最坏情况,我们选择最优的k kk
d p [ n ] [ s ] = min ⁡ k = 0 n − 1 ( 1 + max ⁡ ( d p [ k ] [ s − 1 ] , d p [ n − k − 1 ] [ s ] ) ) dp[n][s] = \min_{k=0}^{n-1} \left(1 + \max(dp[k][s-1],\ dp[n-k-1][s])\right)dp[n][s]=k=0minn1(1+max(dp[k][s1],dp[nk1][s]))

2. 算法实现

由于N ≤ 1000 N \le 1000N1000S ≤ 20 S \le 20S20,我们可以使用动态规划预先计算所有可能的d p [ n ] [ s ] dp[n][s]dp[n][s]值。对于每个测试用例,直接查表输出结果即可。

  • 时间复杂度O ( N 2 ⋅ S ) O(N^2 \cdot S)O(N2S),对于给定范围是可接受的。
  • 空间复杂度O ( N ⋅ S ) O(N \cdot S)O(NS)

3. 注意事项

  • 题目中给出的S SSAlice \texttt{Alice}Alice获胜所需的strike \texttt{strike}strike次数,因此Bob \texttt{Bob}Bob最多能承受S − 1 S-1S1strike \texttt{strike}strike。我们在计算时实际使用的s = S − 1 s = S-1s=S1
  • S = 1 S = 1S=1时,Bob \texttt{Bob}Bob不能承受任何strike \texttt{strike}strikes = 0 s=0s=0),此时只能顺序猜测,需要N NN次。

代码实现

#include<bits/stdc++.h>usingnamespacestd;constintMAX_N=1005;constintMAX_S=25;constintINF=0x3f3f3f3f;intdp[MAX_N][MAX_S];// 预处理所有 dp[n][s] 的值voidprecompute(){// 初始化:没有数字需要猜的情况for(ints=0;s<MAX_S;++s)dp[0][s]=0;// 初始化:不能承受任何 strike 的情况for(intn=1;n<MAX_N;++n)dp[n][0]=n;// 动态规划递推for(intn=1;n<MAX_N;++n){for(ints=1;s<MAX_S;++s){intbest=INF;// 尝试所有可能的猜测位置 kfor(intk=0;k<n;++k){intstrikePart=dp[k][s-1];// 猜大后的情况intsmilePart=dp[n-k-1][s];// 猜小后的情况intworst=1+max(strikePart,smilePart);if(worst<best)best=worst;}dp[n][s]=best;}}}intmain(){precompute();// 预先计算intc,n,S;cin>>c;while(c--){cin>>n>>S;ints=S-1;// Bob 最多能承受的 strike 次数if(s<0)s=0;// 安全处理边界cout<<dp[n][s]<<endl;}return0;}

样例解析

样例输入

2 3 2 4 1

样例输出

2 4
解释:
  1. N = 3 , S = 2 N=3,\ S=2N=3,S=2Bob \texttt{Bob}Bob最多能承受1 11strike \texttt{strike}strike。最优策略是先猜1 11

    • 若得strike \texttt{strike}strike,则X = 0 X=0X=0,下一轮猜0 00,共2 22次。
    • 若得smile \texttt{smile}smile,则X = 2 X=2X=2,下一轮猜2 22,共2 22次。
    • 若猜中,则只需1 11次。
      最坏情况为2 22次。
  2. N = 4 , S = 1 N=4,\ S=1N=4,S=1Bob \texttt{Bob}Bob不能承受任何strike \texttt{strike}strikes = 0 s=0s=0)。只能从0 00开始顺序猜测,最坏情况(X = 3 X=3X=3)需要猜0 , 1 , 2 , 3 0,1,2,30,1,2,34 44次。

总结

本题通过动态规划巧妙地处理了带有strike \texttt{strike}strike限制的猜数策略问题。关键在于定义状态d p [ n ] [ s ] dp[n][s]dp[n][s]并找到正确的状态转移方程,即每次猜测后根据反馈(strike \texttt{strike}strikesmile \texttt{smile}smile)进入不同的子问题。预处理所有状态后,即可快速回答每个测试用例。该算法在给定数据范围内效率良好,是解决此类“最坏情况最优策略”问题的典型方法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 16:49:52

强力教程:3步掌握X-AnyLabeling中GeCO模型的目标计数技术

想要快速实现图像中的目标计数和人群密度分析吗&#xff1f;X-AnyLabeling结合GeCO模型提供了一个完整的解决方案&#xff01;作为一款基于AI的数据标注工具&#xff0c;X-AnyLabeling通过集成Segment Anything模型和其他先进算法&#xff0c;让目标检测和计数变得前所未有的简…

作者头像 李华
网站建设 2026/4/16 11:28:08

数据中台不只是技术:让业务人员也能玩转的数据协同逻辑

数据中台不只是技术&#xff1a;让业务人员也能玩转的数据协同逻辑 “我们有数据中台&#xff0c;但没有数据。”这是许多业务部门负责人的真实心声。数字化转型浪潮下&#xff0c;企业投入巨资构建了技术先进的数据中台&#xff0c;旨在打通数据孤岛、驱动业务创新。然而&…

作者头像 李华
网站建设 2026/4/15 21:36:30

Flutter引擎富文本渲染深度剖析:跨平台渲染架构与性能优化实战指南

在移动应用开发领域&#xff0c;富文本渲染性能直接影响用户体验&#xff0c;特别是面对长篇文档、即时通讯等场景。Flutter Engine作为跨平台渲染的核心引擎&#xff0c;其富文本处理机制通过精密的系统资源调度和渲染管线优化&#xff0c;实现了复杂文本的高效渲染。本文将深…

作者头像 李华
网站建设 2026/4/16 13:32:21

macOS应用轻松管理,Applite让Homebrew Casks一目了然

项目标题与描述 Applite Applite 是一款用户友好的 macOS 图形用户界面应用程序&#xff0c;专为管理 Homebrew Casks 设计。它是一个免费开源项目&#xff0c;致力于为非技术用户提供一个便捷、直观的“应用商店”&#xff0c;用于安装和管理通过 Homebrew Cask 分发的第三方…

作者头像 李华
网站建设 2026/4/16 13:37:30

Pearcleaner:macOS应用彻底清理的终极免费工具

Pearcleaner&#xff1a;macOS应用彻底清理的终极免费工具 【免费下载链接】Pearcleaner Open-source mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 想要彻底清理macOS系统中的应用程序残留文件吗&#xff1f;Pearcleaner作为一款开源免费…

作者头像 李华
网站建设 2026/4/16 11:59:36

2025最新流出9款免费AI论文工具:真实参考文献查重低原创高!

凌晨3点&#xff0c;你的论文deadline只剩24小时&#xff1f;查重率飙到30%、AI检测率超标、导师反馈堆成山、复杂公式图表不会做&#xff1f;别慌&#xff01;2025最新流出的9款免费AI论文工具&#xff0c;尤其是核心推荐的PaperFine&#xff0c;能让你10分钟生成万字初稿、2小…

作者头像 李华