题目描述
给你一根长度为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
解答:
class Solution {
public:
int cutRope(int number) {
if(number==2)
return 1;
if(number==3)
return 2;
if(number%3==0)
return pow(3,number/3);
else if((number-1)%3==0)
return 4*pow(3,(number-4)/3);
else
return 2*pow(3,(number-2)/3);
}
};
上面是当时在牛客提交的答案。
下面是用case语句写,看起来更加整齐一些:
#include <iostream>
#include<cmath>
using namespace std;
int f(n){
switch(1){
case n=2:
return 1;
break;
case n=3:
return 2;
break;
case n%3 == 0:
return pow(3,n/3);
break;
case (n-1)%3 == 0:
return 4*pow(3,(n-4)/3);
break;
default:
return return 2*pow(3,(n-2)/3);
break;
}
}
int main() {
int n = 0;
cin >> n;
cout << f(n) << endl;
return 0;
}
最大的乘数只能是2和3的幂数的组合,找出对应的2或者3的个数就可以了。没有什么动态规划,贪婪算法。
n=2,n=3是特例,单独写就行。
从n=4开始,
在纸上画出来,画十几个数字就能发现一个规律:
2的幂数是2、1、0的循环;
3的幂数由2的幂数决定,所以解决问题的关键,在于找出来决定2的幂数的条件。
然后发现2的幂数是0,对应的数是3的倍数,2的幂数是2,对应的数减去1是3的倍数,其余的数对应的2的幂数是1.
把三种情况列出来,分别计算就好了。
总结
这类问题分类讨论就可以了。