(2021-8-15编写)同学出的一道题

该博客探讨了一种使用贪心策略解决数学问题的方法,即如何从两根装有编号球的管子中取球,使得最终形成的数字最大。通过分析不同局面和优化策略,将时间复杂度降低到O(n^2),实现了有效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意: 有两根管子,每根管子里装着nnn个球,每个球上面写着000999其中之一。每次想要取球,都可以任选一根管子,然后选择是从管子的头部或尾部取一个球。现在已知两根管子里球的顺序,要求找到一种合法的取球顺序,使得取出的球按取球的顺序排列后,得到的2n2n2n位数最大(先取的球是高位)。
T≤100T\le 100T100组测试数据,每组测试数据n≤50n\le 50n50
做法: 本题需要用到贪心。
像这种要求最后取出的数连起来最大的问题,想到可以每次贪心地取出可能情况下能取出的最大的数。如果所有数都不相等的话,这个很显然是对的,但现在的问题就是数字可以相等,那么当前的最优选择之一,所产生的布局可能之后就不是最优的了。这并不意味着我们就不能贪心了,我们只要稍微改一下就可以了。
由于我们担心的是所有当前最优选择中,产生出的某一个局面可能不优,那其实很简单,我们只要记录下所有当前最优选择产生的所有局面就可以了。固定当前已取iii个球,那么可能的局面总数最多只有O(n2)O(n^2)O(n2)个。然后对于所有子局面,最多有444种选择,把所有选择中真正的最优选择找到,然后继续得出所有可能的下一步的局面即可。这样进行2n2n2n次,就可以用O(n3)O(n^3)O(n3)的时间复杂度解决此题。
这个已经够好了,不过可以优化到更好,那就是分开考虑两根管子(因为两根管子之间相互独立),用以上方法得到分别的取数顺序。由于只有一根管子了,此时一个阶段里最多只有nnn个可能局面。注意到最后合起来最优的取数顺序,一定是这两个顺序的一个归并,所以我们再进行一次类似的贪心,只不过现在一个状态的表示是“左边取iii个,右边取jjj个”,那么此时一个阶段里也最多只有nnn个可能局面。两次贪心后,就可以以O(n2)O(n^2)O(n2)的时间复杂度解决此题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值