P9234 [蓝桥杯 2023 省 A] 买瓜

news/2025/10/5 23:16:48/文章来源:https://www.cnblogs.com/mLazy/p/19127168
难度 算法s 日期 题目链接
普及+/提高 折半搜索、剪枝 2025-07-20 https://luogu.com.cn/problem/P9234

我觉得此题没有参考价值。

本题解聚焦于剪枝优化上。如果只是简单地使用折半搜索,很容易 \(\text{TLE}\)。我感觉这道题的难度在于怎么调优(而不是想到折半搜索)。

以下都把第 \(i\) 个瓜的重量存在 a[i] 中(\(1\le i\le n\));n 是瓜的数量,m 是目标重量。

Part I:折半搜索

先说说朴素的搜索方式,让我们结合代码理解一下搜索过程。我们从第一个瓜开始暴力枚举它的三种状态:买、买一半、全买。

// i 表示当前枚举的瓜;sum 表示目前买下的瓜的总重;div 表示到目前一共砍了几刀
void dfs(int i, int sum, int div) {if (i == n + 1) { // 搜到头了if (sum == m) ans = min(ans, div); // 统计答案}// 枚举第 i+1 个瓜的状态dfs(i + 1, sum, div); // 不买第 i 个瓜dfs(i + 1, sum + a[i], div); // 买下整个第 i 个瓜dfs(i + 1, sum + (a[i] >> 1), div + 1); // 买下第 i 个瓜的一半,要让 div +1// a[i] >> 1 相当于 a[i] / 2
}

入口点是 dfs(1, 0, 0)。这样做的时间复杂度如何?不难看出是 \(O(3^n)\)。这题 \(n\le30\)\(3^{30}\approx10^{14}\),显然过不了。所以我们要用 折半搜索

  • mid = n / 2,我们先搜第 i ~ mid 个瓜,再搜第 mid+1 ~ n 个瓜。第一遍搜索记为 dfs1(),第二遍是 dfs2()
  • dfs1() 中,每次我们搜完前半段,就记录下 “要买下总重 sum 的瓜,至少要切几刀”。我们创建一个 unordered_map<int,int> mpmp[sum] 就记录买下总重为sum 的瓜至少要切几刀。
  • dfs2() 中,如果我们发现当前 mp[] 中存在 map[m - sum],那么意味着我们可以在前 n / 2 个瓜中购买总重为 m - sum 的瓜,然后和当前状态 sum拼起来,恰好达到了目标 m。此时更新答案。

这里要注意一个细节:“砍半” 要把瓜的重量除以 2,可能出现小数,不好处理。所以我们在输入时让目标 m 和每个 a[i] 都乘以 2,这样可以保持问题等价,又可以避免搜索时出现小数。

这样做的时间复杂度如何?搜索每个半段需要枚举 \(O(3^{n/2})\) 种情况,unordered_map 的插入和查询近乎 \(O(1)\),所以总时间复杂度为:\(O(3^{n/2})\)

然而请看这里:评测记录 & 代码。\(\text{TLE}\)\(64\text{pts}\)。接下来,踏上剪枝之旅吧。

Part II:剪枝(效果不大)

我们容易想到以下几种剪枝:

逻辑 说明
if (sum > m) return; 可行性剪枝。如果当前买的瓜已经超过目标了,继续搜索不可能达到目标。
dfs2() 中:if (div >= ans) return; 最优性剪枝。如果当前砍的次数已经超过统计出的最优答案了,继续搜索不可能得到更优解。

应用了以上剪枝,结果请看:评测记录 & 代码。\(\text{TLE}\)\(76\text{pts}\)。当然,还可以想到下面的几种剪枝(看了一下题解区):

逻辑 说明
dfs1() 中:if (sum == m) { ans = min(ans, div); return; } 提前统计答案并终止搜索。这样还可以在 dfs1() 中使用上面的最优性剪枝。
dfs1() 中:如果存在 mp[sum] < div,直接 return; 最优性剪枝。正确性有待证明。

但是当你一一尝试这些剪枝后,会发现即使全部打上也难逃 \(\text{TLE}\) 的命运。是时候试试更激进的优化方法了:

Part III:排序(玄学调优)

你可能在讨论区和题解区发现了这个神奇的事情:只要在搜索之前加上一句 sort()把瓜的大小从小到大排序,就可以神奇地 \(\text{AC}\)。甚至即使你没有用 Part II 提到的任何剪枝!看这里:评测记录 & 代码(没开 O2 哦)。更离谱的是似乎不用折半搜索也能过:排序为什么会使搜索变快 - 洛谷。可见搜之前排序是重要的优化方法。

实在是玄学至极。在洛谷的评测机上,排序后可以带来巨大的性能提升。但是我在本地难以复现这一行为。事实上我构造的数据平均要跑 3s 多。

肯定是题目数据太水了!!而且还有奇妙的性质?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1044 [NOIP 2003 普及组] 栈

难度 算法s 日期 题目链接普及− DP 2025-05-21 https://luogu.com.cn/problem/P1044因为本人 DP 很差,故撰此文巩固一下。 本文是对 P1044 [NOIP 2003 普及组] 栈 题解 的详细解释。 写的很直白了。。。几乎没有理解…

餐饮环境评估在哪个网站做网站开发一定要用框架吗

1.Kafka中的ISR、AR又代表什么&#xff1f;ISR&#xff1a;与leader保持同步的follower集合AR&#xff1a;分区的所有副本2.Kafka中的HW、LEO等分别代表什么&#xff1f;LEO&#xff1a;没个副本的最后条消息的offsetHW&#xff1a;一个分区中所有副本最小的offset3.Kafka中是怎…

宁波小型建网站公司新网站 seo

效果图 在uniapp微信小程序/手机h5网页网站/安卓app/苹果app/支付宝小程序/nvue等(全平台完美兼容)开发中,实现uniApp各端都兼容的 “刻度尺(横格尺 | 尺子)” 手势左右两侧拖动、手指滑动刻度尺功能,水平刻度尺,支持自定义尺子颜色、大小、刻度、滑动时的步进值、最大…

P1080 [NOIP 2012 提高组] 国王游戏

难度 算法s 日期 题目链接普及+/提高 贪心、邻项排序 2025-07-25 https://luogu.com.cn/problem/有 \(n\) 个大臣和一个国王,每个大臣左、右手各有一个数,分别记为 \(a_i,b_i\),国王手上也有数,记为 \(a,b\)。现在…

音响没声音

联想拯救者x9000p笔记本(win11)之前总来不来就没音(只能听到特定几个音调),然后隔一段时间重启莫名其妙就好了,以为是静电。 这次又故障了,就把如图关了,就解决了,查了驱动也都是最新,网上有人说这个会消杂音…

P1654 OSU!

难度 算法s 日期 题目链接提高+/省选− 数学期望、递推 2025-07-21~22 https://luogu.com.cn/problem/P1654似乎是一道蛮经典的期望递推题。 洛谷上的题解看不懂,老师讲的也很简略。只有自己推起来感觉很复杂。。。心…

响应式网站几个断点毕节市城乡建设局网站

文章目录 年费和小额账户管理费减免政策&#xff1a;每家银行均可有一张借记卡享受双免政策减免政策&#xff1a;代发工资、低保、社保、医保、失业保险、养老金、退休金、住房公积金等账户减免政策&#xff1a;二、三类电子账户一类卡、二类卡和三类卡二、三类电子账户不收取年…

做网站网络合同石河子网站制作

问题如下;Java代码中的方法是&#xff1a;Rule foo(){return sequence(foo(), x());}这将引发解析循环,当然应该避免;但是,这是合法的&#xff1a;Rule foo(){return sequence(x(), foo());}现在,代码中的其他地方我可以访问RuleMethod,这是一个扩展MethodNode的类,因此我可以访…

10/5

今日学习了Java,背诵了英语单词,明日继续

10/4

今日学习了Java,背诵了英语单词,明日继续

DynamoDB十年演进:云原生数据库的技术革新

本文深入探讨了Amazon DynamoDB云原生数据库的十年发展历程,从Dynamo研究论文到完全托管服务的演进,涵盖了分布式系统架构设计、弹性扩展机制、毫秒级性能优化等核心技术突破,以及全球表、事务支持等创新功能的发展…

惠州网站建设英语怎么快速搭建网站

当用C语言来实现猜数字游戏时&#xff0c;我们可以设计一个简单的游戏规则&#xff1a;计算机随机生成一个1到100之间的整数&#xff0c;玩家需要通过猜测来猜出这个数字。游戏会根据玩家猜测的数字与目标数字的大小关系给出提示&#xff0c;直到玩家猜中为止。 下面是一个用C…

详细介绍:【python】uv管理器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

企业微网站开发锛网站

现在&#xff0c;人工智能的发展处于跳跃式阶段&#xff0c;我们也对AI在大型数据集的应用进展感到吃惊。更重要的是&#xff0c;那些我们没有跟踪的数十亿张照片或餐厅的评论并没有被遗漏掉&#xff1a;迁移学习技术让收集数据变得更加“容易”。另外&#xff0c;得益于PyTorc…

深圳网络做网站app开发费用大概多少

22/06/2005 12:22 FPOracle从8.1.6开始提供分析函数&#xff0c;分析函数用于计算基于组的某种聚合值&#xff0c;它和聚合函数的不同之处是对于每个组返回多行&#xff0c;而聚合函数对于每个组只返回一行。下面例子中使用的表来自Oracle自带的HR用户下的表&#xff0c;如果没…

NotImplementedError: Cannot convert a symbolic Tensor (lstm/strided_slice:0) to a numpy array.

NotImplementedError: Cannot convert a symbolic Tensor (lstm/strided_slice:0) to a numpy array. This error may indicate that youre trying to pass a Tensor to a NumPy call, which is not supportednumpy …

porting perf性能观测工具

1.cd sdk/kernel/linux/linux-6.1.83/tools/perf 2.make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- NO_LIBPYTHON=1 NO_LIBPERL=1 NO_LIBBPF=1 3.在当前路径下生成perf 4.copy到板子/tmp目录下 scp ./per…

Windows常用快捷指令

Windows常用快捷指令 总览shift+数字键:输入数字键上的特殊符号 shift+Ctrl:切换输入法(台式电脑) shift+空格:切换输入法(笔记本电脑) Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+X:剪切 Ctrl+Z:撤销 Ctrl+Y:重做 Ctr…

网站建设价格方案网站程序 wordpress 织梦 discuz

公证服务信息您是否需要高吞吐量的Corda网络&#xff1f; 网络的吞吐量是否稳定&#xff1f; 您是否已经从其他领域挤出了所有可能的表现&#xff1f; 如果您对这些问题的回答是“是”&#xff0c;那么我可能会为您提供一些有用的信息。 我列出了这些问题&#xff0c;以减少您过…