题目大意: 有两根管子,每根管子里装着
n
n
n个球,每个球上面写着
0
0
0到
9
9
9其中之一。每次想要取球,都可以任选一根管子,然后选择是从管子的头部或尾部取一个球。现在已知两根管子里球的顺序,要求找到一种合法的取球顺序,使得取出的球按取球的顺序排列后,得到的
2
n
2n
2n位数最大(先取的球是高位)。
T
≤
100
T\le 100
T≤100组测试数据,每组测试数据
n
≤
50
n\le 50
n≤50。
做法: 本题需要用到贪心。
像这种要求最后取出的数连起来最大的问题,想到可以每次贪心地取出可能情况下能取出的最大的数。如果所有数都不相等的话,这个很显然是对的,但现在的问题就是数字可以相等,那么当前的最优选择之一,所产生的布局可能之后就不是最优的了。这并不意味着我们就不能贪心了,我们只要稍微改一下就可以了。
由于我们担心的是所有当前最优选择中,产生出的某一个局面可能不优,那其实很简单,我们只要记录下所有当前最优选择产生的所有局面就可以了。固定当前已取
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)的时间复杂度解决此题。
(2021-8-15编写)同学出的一道题
最新推荐文章于 2021-11-14 21:03:27 发布