剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述:
输出答案。
示例1
输入:8
输出:18
解题思路
先举几个例子,可以看出规律来:
4:2×24 : 2\times 24:2×2
5:2×35 : 2\times 35:2×3
6:3×36 : 3\times 36:3×3
7:2×2×37 : 2\times2\times37:2×2×3或者4×34\times34×3
8:2×3×38 : 2\times3\times38:2×3×3
9:3×3×39 : 3\times3\times39:3×3×3
10:2×2×3×310:2\times2\times3\times310:2×2×3×3或者4×3×34\times3\times34×3×3
11:2×3×3×311:2\times3\times3\times311:2×3×3×3
12:3×3×3×312:3\times3\times3\times312:3×3×3×3
13:2×2×3×3×313:2\times2\times3\times3\times313:2×2×3×3×3或者4×3×3×34\times3\times3\times34×3×3×3
分析:
- 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。 当然也可能有4,但是4=2×24=2\times24=2×2,我们就简单些不考虑了。 5<2×35<2\times35<2×3,KaTeX parse error: Undefined control sequence: \tims at position 4: 6<3\̲t̲i̲m̲s̲3,比6更大的数字我们就更不用考虑了,肯定要继续分。
- 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为222<3*3,那么题目就简单了。
- 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。
- 由于题目规定m>1,所以2只能是11,3只能是21,这两个特殊情况直接返回就行了。
- 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
代码示例
import java.util.Scanner;
public class CutRope {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int res = cutRope(num);
System.out.println(res);
}
private static int cutRope(int num) {
if (num == 2) {
return 1;
}
if (num == 3) {
return 2;
}
int x = num % 3;
int y = num / 3;
if (x == 0) {
return (int) Math.pow(3, y);
} else if (x == 1) {
return (int) (2 * 2 * Math.pow(3, y - 1));
} else {
return (int) (2 * Math.pow(3, y));
}
}
}