时间限制:1秒 空间限制:65536K 热度指数:20812
本题知识点: 贪心
题目描述
给你一根长度为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)
输出描述:
输出答案。
题目链接:题目链接
这题先枚举一下;
当n=1时,res = 0(必须分成2段以上);
当n=2时,res = 1(分成1*1);
当n=3时, res = 2(分成1*2);
当n=4时, res = 4(分成2*2);
当n=5时, res = 6(分成2*3);
当n=6时, res = 9(分成3*3);
这里可以看到,当n>3时,每段剪成2或者3是最优的。但是什么时候剪成长度为2、什么时候剪成长度为3呢?
这里我们可以注意一下n=6时,3*3>2*2*2,而n=4时,2*2>1*3。
所以可以得出,(n>3)时:
n % 3 = 0,res = pow(3, n/3);(全部都分成长度为3的)
n % 3 = 1,res = pow(3, n/3-1) * 2 * 2(分成两个长度为2,剩下的全分成长度为3,因为1*3<2*2)
n % 3 = 2,res = pow(3, n/3) * 2(分成一个长度为2,剩下的全分成长度为3)
class Solution {
public:
long long cutRope(int number) {
int ppow = number / 3;
int rr = number % 3;
long long res = 1;
if (number == 1 || number == 2)
return res;
if (number == 3)
return res * 2;
res = pow(3,ppow);
if (rr == 1){
res /= 3;
res = res * 2 *2;
}
else if (rr == 2){
res = res * 2;
}
return res;
}
};