ブラッシングノート(14)-ロープを切る
タイトルの説明
長さ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の3つのセクションにカットします。このとき得られる最大の積は18です。
例1
入力
8
アウトプット
18
アイデア:質問の分割数に制限はなく、直感的に不規則に見えます。1、2、3、4は結果を直接取得できるため、次の点を考慮します。
4は1、3、2、2にのみ分割できるため、明らかに2 * 2の方が大きいため、後で遭遇する4を直接2、2に分割できます。
5:1、2、2;2、3;
6:1.5(5が次いで、上記のように分解); 2,2,2; 3,3 ;
7:1,6(6次に、上記のように分解); 2.5(その後5上によれば分解)、3.2.2。
……
2、3に分かれています
それが3の倍数である場合、それらはすべて3に直接分割されて、3の一定の累乗が得られます。
3の倍数でない場合は、まず3の倍数と余りの部分に分割して、3の累乗*余り(2または1)を取得します。
class Solution {
public:
int cutRope(int number) {
if(number==1)return 1;
else if(number==2) return 1;
else if(number==3)return 2;
else if(number==4)return 4;
else
{
if(number%3==0)
{
int x=number/3;
return pow(3,x);
}
else
{
int x=number/3;
int y=number%3;
return pow(3,x)*y;
}
}
}
};