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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值