/* 0~9每个数字的,比如数字0有6个小木棍组成 int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int a[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}; 1、看了一眼数据范围,最大1e5,所以,双重循环的O(N^2)肯定是要挂掉的。 2、观察一下上面的a数组,发现 {2:1} {3:7} {4:4} {5:2,3,5} {6:0,6,9} {7:8} 有啥规律呢?我们发现,如果现在需要处理掉5个小木棍,我肯定会贪心的选择2这个数字,而不会去使用3或者5,因为不管怎么样,2可以保证更小的结果。 但6的话需要讨论一下: (1)非前导零时,选择0 (2)前导零时,选择6,9肯定没用,因为6永远比9划算。所以整理上面的数字规律如下: {2:1} {3:7} {4:4} {5:2} {6:0,6} {7:8} 下面我们找第一个测试用例尝试一下,看看能不能找出什么规律,这时,不要找太极端的数字,即不是最大的,也不是最小的 比如2,输出:1 比如3,输出:7 比如6,输出:6 比如18,输出208 通过6根数,我们为什么没有输出0呢?是因为题目说了,不能有前导零,所以在代码中应该有一个关键词 prefix_zero,用来判断是否是前导零。 那18输出208是怎么回事呢? 2-->5 0-->6 8-->7 5+6+7=18根木棍 6!=6*5*4*3*2*1=720 720*1e5=7.2e7 < 1e8,所以做一个 6!次运算是没有问题的,也就是说,这是一道dfs题 */ // 数字0:6根木棍 // 数字1:2个木棍 // 数字2:5根木棍 // 数字4:4根木棍 // 数字7:2根木棍 // 数字8:7根木棍