(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)的时间复杂度解决此题。

你可能感兴趣的:(算法-贪心)