2026/4/13 6:43:22
网站建设
项目流程
南昌网站设计资讯,wordpress 锚文本,wordpress第三方登录,宣传片拍摄预算表题目描述
你和朋友在玩一个猜数字游戏。 朋友想一个 111 到 NNN 之间的整数#xff08;包含两端#xff09;。 你可以无限次猜测#xff0c;但希望用尽可能少的次数猜中。 朋友不会直接告诉你是否正确#xff1b;唯一的反馈是#xff1a; 从第二次猜测开始 #xff0c;他…题目描述你和朋友在玩一个猜数字游戏。 朋友想一个111到NNN之间的整数包含两端。 你可以无限次猜测但希望用尽可能少的次数猜中。 朋友不会直接告诉你是否正确唯一的反馈是从第二次猜测开始他会说“变热”或“变冷”表示这次猜测比上一次更接近还是更远离目标数字如果距离相同他可能说任意一个。 当你确定最后一次猜测正确时告诉朋友游戏胜利。注意每次猜测都必须是真正的猜测符合所有已知信息。问题在最坏情况下需要多少次猜测输入多个测试用例每行一个整数NNN1≤N≤3001 \le N \le 3001≤N≤300以N0N 0N0结束。输出对每个用例输出最大猜测次数。样例输入75 75 0样例输出10 guess(es) required. 10 guess(es) required.题目分析这是一个最优最坏情况决策问题。我们需要设计一个策略使得在最坏的反馈序列下猜测次数最少。关键约束第一次猜测没有“变热/变冷”反馈第二次及以后的每次猜测都有反馈相对于上一次反馈只告诉我们“更近”或“更远”不直接给出距离解题思路1. 问题本质每次猜测后根据反馈可以排除一部分不可能的数字。我们需要选择猜测位置使得无论反馈如何剩余的可能区间尽可能小。2. 状态定义设f(l,r,last)f(l, r, last)f(l,r,last)表示已知目标数字在区间[l,r][l, r][l,r]内上一次猜测的数字是lastlastlast从当前状态开始还需要的最少猜测次数包括当前这次边界情况如果lrl rlr且lastllast llastl说明已经知道答案只需111次确认如果lrl rlr但last≠llast \neq llastl需要先猜lll再确认共222次3. 状态转移假设当前猜测gggg∈[l,r]g \in [l, r]g∈[l,r]且g≠lastg \neq lastglast根据反馈“变热”目标离ggg比离lastlastlast更近即∣x−g∣∣x−last∣|x - g| |x - last|∣x−g∣∣x−last∣“变冷”目标离ggg比离lastlastlast更远即∣x−g∣∣x−last∣|x - g| |x - last|∣x−g∣∣x−last∣我们需要计算两种反馈对应的新区间。区间划分公式解不等式∣x−g∣∣x−last∣|x - g| |x - last|∣x−g∣∣x−last∣如果glastg lastglast目标xxx在ggg和lastlastlast的中点右侧即xglast2x \frac{g last}{2}x2glast由于xxx是整数分两种情况如果glastg lastglast是偶数xglast2x \frac{g last}{2}x2glast即x≥glast21x \ge \frac{g last}{2} 1x≥2glast1如果glastg lastglast是奇数xglast2x \frac{g last}{2}x2glast即x≥⌈glast2⌉x \ge \lceil \frac{g last}{2} \rceilx≥⌈2glast⌉令mid1⌊glast2⌋mid1 \lfloor \frac{g last}{2} \rfloormid1⌊2glast⌋mid2⌈glast2⌉mid2 \lceil \frac{g last}{2} \rceilmid2⌈2glast⌉则“变热”对应区间[max(l,mid2),r][max(l, mid2), r][max(l,mid2),r]“变冷”对应区间[l,min(r,mid1)][l, min(r, mid1)][l,min(r,mid1)]如果glastg lastglast对称地“变热”对应区间[l,min(r,mid1)][l, min(r, mid1)][l,min(r,mid1)]“变冷”对应区间[max(l,mid2),r][max(l, mid2), r][max(l,mid2),r]4. 最优决策对于每个状态(l,r,last)(l, r, last)(l,r,last)我们枚举所有可能的猜测ggg计算hotf(“变热”后的区间,g)hot f(\text{“变热”后的区间}, g)hotf(“变热”后的区间,g)coldf(“变冷”后的区间,g)cold f(\text{“变冷”后的区间}, g)coldf(“变冷”后的区间,g)由于我们考虑最坏情况所以这次猜测的代价是1max(hot,cold)1 \max(hot, cold)1max(hot,cold)。我们选择ggg使得这个代价最小f(l,r,last)ming∈[l,r],g≠last(1max(hot,cold)) f(l, r, last) \min_{g \in [l, r], g \neq last} \left( 1 \max(hot, cold) \right)f(l,r,last)g∈[l,r],glastmin(1max(hot,cold))5. 状态压缩与记忆化直接三维状态f(l,r,last)f(l, r, last)f(l,r,last)的状态数是O(N3)O(N^3)O(N3)太大。关键观察状态实际上只依赖于区间长度lengthr−llength r - llengthr−llastlastlast到区间边界的距离dist{last−lif last≥lr−lastif lastldist \begin{cases} last - l \text{if } last \ge l \\ r - last \text{if } last l \end{cases}dist{last−lr−lastiflast≥liflastl这是因为区间可以平移相同长度和相对距离的状态是等价的。因此我们使用二维数组dp[length][dist]dp[length][dist]dp[length][dist]进行记忆化状态数降为O(N2)O(N^2)O(N2)。6. 初始猜测第一次猜测没有lastlastlast我们可以选择任意位置first∈[1,N]first \in [1, N]first∈[1,N]。最终答案是minfirstf(1,N,first)\min_{first} f(1, N, first)minfirstf(1,N,first)。算法复杂度状态数O(N2)O(N^2)O(N2)每个状态计算枚举O(N)O(N)O(N)个可能的ggg总复杂度O(N3)O(N^3)O(N3)对于N≤300N \le 300N≤300可以接受参考代码// Hot or Cold// UVa ID: 10826// Verdict: Accepted// Submission Date: 2025-12-24// UVa Run Time: 0.050s//// 版权所有C2025邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constintMAXN310,INF0x3f3f3f3f;// dp[length][dist] 还需要的最小猜测次数intdp[MAXN][MAXN];// 计算在区间 [l, r] 内已知上次猜测是 last 时还需要的最小猜测次数intdfs(intl,intr,intlast){// 区间只剩一个数if(lr)return(lastl)?1:2;// 压缩状态length 区间长度dist last到边界的距离intlengthr-l;intdist(lastl)?(last-l):(r-last);// 记忆化if(~dp[length][dist])returndp[length][dist];intbestINF;// 枚举当前猜测点 gfor(intgl;gr;g){if(glast)continue;// 不能重复猜同一个数// 计算分界点|t-g| |t-last| 等价于 t midintmid1(glast)/2;// 向下取整intmid2(glast1)/2;// 向上取整inthot0;// 更热情况intcold0;// 更冷情况if(glast){// g 在 last 左边// 更热: 目标在右边 [max(l,mid2), r]if(mid2r)hotdfs(max(l,mid2),r,g);// 更冷: 目标在左边 [l, min(r,mid1)]colddfs(l,min(r,mid1),g);}else{// g 在 last 右边// 更热: 目标在左边 [l, min(r,mid1)]if(mid1l)hotdfs(l,min(r,mid1),g);// 更冷: 目标在右边 [max(l,mid2), r]colddfs(max(l,mid2),r,g);}// 最坏情况 当前这次猜测intworstmax(hot,cold)1;bestmin(best,worst);}returndp[length][dist]best;}intmain(){// 初始化记忆化数组memset(dp,-1,sizeofdp);intn;while(cinnn){intanswerINF;// 第一次猜测可以选择任意位置for(intfirst1;firstn;first){answermin(answer,dfs(1,n,first));}coutanswer guess(es) required.endl;}return0;}总结本题的难点在于理解“变热/变冷”反馈的信息含义将问题转化为区间划分的动态规划设计状态压缩减少复杂度核心技巧利用不等式推导区间划分公式通过对称性压缩状态采用minmax\min \maxminmax决策应对最坏情况这个解法充分利用了问题的数学性质在O(N3)O(N^3)O(N3)时间内解决了N≤300N \le 300N≤300的问题是一个优雅且高效的解决方案。