Link
Solution
K非常大。。 由这个条件
先按权值从小到大排序,对于权值相同的,根据所用珠子集合的标号的字典序从小到大排序
可以启发得到一种想法:先找到第K大的权值,再构造相应字典序的解。
所以第一步需要找到第K大的权值,常用的思路是把选出的数字集合按照一些性质分类、扩展,用一个堆来维护(K个串)。对于这道题来说,有这样一种构造方法:
首先把整个序列排序
堆的每个节点维护一个数对,表示和为,编号的最大值为。扩展的时候,扩展出和
为什么这样就能不重不漏地取到前大的权值和呢?为什么不能呢。。不会严格证明,但是可以感受到这样确实是可以不重不漏地取到的。。一个集合,根据倒数第二个点取或者没取,只有一个前驱;不停地递归下去,肯定会回到状态
在计算第大的权值和的同时,还要记录前大的权值和中有多少个和第大的权值和相同,设为。那么就需要构造出权值和为,字典序第大的集合。
让我万万想不到的是,构造的方法就是深搜。。每次找到最靠左的且小于当前总和的数字,减掉之后搜下去。。
想不明白复杂度?
Tips
如果能像这样先把权值搞掉只搜字典序,就大大简化了问题。。 字典序是有可能需要搜的。。。
Code
1 |
|