官方的 Tutorial 中有这一句话。
If the product of numbers is greater than or equal to 1016, then it is beneficial for us to put the multiplication sign everywhere.
其意思是指在输入为 ±* 或者 +* 时,倘若输入中一段数字的乘积大于1016 ,那么如果把数字之间任何一个*改成+,最后得到的值都不如连乘来的大
为什么连乘起来大于1016时就不用考虑加法呢?
我一开始对这个1016感到困惑,现在在这里给出我自己的看法
自然的,在大部分情况下,乘法产生的值的确比加法来的大
像
2
+
1
+
2
>
2
∗
1
∗
2
2+1+2>2*1*2
2+1+2>2∗1∗2 这种操作,直觉上应该是特例
那么是否的确存在像 1016 这样一个界限,我们可以如此处理
先来看一个一般的数列
0 1 1 2 1 9 1 3 4 1 7 5 0
自然的,最开头的 0 或者 1 都是用+去处理,即
0+1+1+2 1 9 1 3 4 1 7 5+0
这样那么最终我们要处理的就是中间这一串数字,要用 + 和 * 使其值最大
2 1 9 1 3 4 1 7 5
注意到形式上的特点,我们把它写的更加一般
a 1 b 1 c 1 d
其中英文字母代表了那些没有 1 的数块,一个数块里面没有 1 ,将这个数块连乘起来自然会比较大,没有必要用加法
接下来我们考虑 1 对我们选取乘法还是加法所带来的影响。
我们先做一个变换
a 1 b 1 c 1 d 变成 a 1 1 1 b c d
也就是把所有的1都前置。
那么这两个数块,连乘的积应该是一样的。
但是,如果存在加法,右边的数块应该来的比左边的大,即
a
+
1
+
b
+
1
+
c
+
1
+
d
<
=
a
+
1
+
1
+
1
+
b
∗
c
∗
d
a+1+b+1+c+1+d<=a+1+1+1+b*c*d
a+1+b+1+c+1+d<=a+1+1+1+b∗c∗d
当然这只是一种情况,事实上,如果我们把左边式子中任何加号改成称号,我们总可以发现右边的式子来的比较大,因为右边的式子充分利用了 1 和 非1
换句话说,右边的式子是使用加法的最优情况,如果只用乘法的值比右边的式子还要大,那么我们不必再考虑加法。
接下来我们来求这个式子的界限
我们把 a 记作 A,代表一个 [2,9] (非 1 ) 的整数
把
b
∗
c
∗
d
b*c*d
b∗c∗d 记作B,代表最后那个非 1 数块的连乘起来的值
中间 1 的个数记为 k
那么,我们希望得到
A
+
k
+
B
<
A
∗
B
A+k+B<A*B
A+k+B<A∗B
一波操作
k + 1 < ( A − 1 ) ∗ ( B − 1 ) < A ∗ B k+1<(A-1)*(B-1)<A*B k+1<(A−1)∗(B−1)<A∗B
由于 k 代表了 1 的个数,最多也就是 n=105
也就是说,当数列乘积大于 105 时,我们直接用 * 全乘起来就可以,相比用 + ,连乘的值一定更大。
以上就是个人的想法,欢迎大家批评指正。
至于为什么官方的题解里写了 1016 ,可能时出题人的小心机
当然更大的可能是我的理解出现了问题
总之,倘若输入中一段数字的乘积大于105 ,那么如果把数字之间任何一个*改成+,最后得到的值都不如连乘来的大