减绳子问题 C++


题目描述

给你一根长度为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.

把三种情况列出来,分别计算就好了。


总结

这类问题分类讨论就可以了。

猜你喜欢

转载自blog.csdn.net/sinat_39416814/article/details/104071817