47 lines
1.7 KiB
Plaintext
47 lines
1.7 KiB
Plaintext
|
|
/*
|
|||
|
|
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根木棍
|