题目大意
如果一个数,从高位到低位是递增的,则称为上升数,例如 1122345。
现在有个大整数
n
,求至少需要多少个上升数,使它们的和为
n<=105e5
解法1.1
上升数可以拆成很多个形如 1111…111 的全 1 数,例如 1122345=1111111+11111+111+11+1。
所以可以考虑把
n
拆成全 1 数,然后合并。因为 1 个上升数最多由 9 个全 1 数合并而来,并且可以任意组合,所以最后的答案是
然后全 1 数可以看成是 1+10+100+100……这样的等比数列和,因此一个
n
位的全 1 数等于
解法1.2
事实上这个
k
不需要枚举,因为
解法2
上述拆成全 1 数的方法其实证明了贪心是对的,即每次选最大的全 1 数,或者回到原题是每次选最大的上升数。比如 720464=699999+20465=699999+19999+466
因为 n−a=n−(a+1)+1 ,所以每次分离一个最大的上升数就相当于,从最高位开始找最长连续的上升序列,然后删掉这个序列,剩下的这个数+1。
所以就 O(5e5) 地从高位开始扫。高精度+1的复杂度也是 O(5e5) 。(每 10 次加法会用到第二位、每 100 次加法会用到第三位……所以是 5e5+5e510+5e5100+…… )