剑指offer 剪绳子

时间限制: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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值