剑指Offer编程题--剪绳子

本文探讨了经典的剪绳子问题,即如何将一根绳子剪成多段以使各段长度的乘积最大化。通过分析实例,发现了最佳策略是尽可能多地产生长度为3的段落,除非最后剩下1单位长度,此时策略会稍作调整。文章提供了详细的解题思路,并附有C++实现代码。

题目链接:剪绳子

题意:

    给一个长为n的绳子,将绳子剪成多段,问这几段绳子的长度的乘积最大可能为多少?

解题思路:

   先写几个找找规律

  1 :   1 * 0  = 1                       2 :  1 *  1 = 1                3 : 1 * 2 = 2;                     4  :  2 * 2 = 4

 5 :   2 * 3 = 6                         6 :  3 * 3 = 9                7 :  4 * 3 = 12;                   8  :  2 * 3 * 3 = 18

 9 : 3 * 3 * 3                           10 : 4 * 3 * 3                11: 2 * 3 * 3 * 3 = 54         12 : 3 * 3 * 3 * 3 = 81

发现规律为,尽可能多的3           如果剩1, 那么3的数量减一

C++代码

class Solution {
public:
    int cutRope(int number) {
        int ans = 1;
    	if(number == 1){
    		return 0;
    	}
    	else if(number == 2){
    		return 1;
    	}
    	else if(number == 3){
    		return 2;
    	}
    	else if(number % 3 == 1){    // 如果剩1
    		int num3 = number / 3 - 1;  // 3的个数减1
    		ans = pow(3, num3);         // 计算3的指数
    		ans = ans * number - num3 * 3;  // 乘剩余的数
    	}
    	else{
    		int num3 = number / 3;  
    		ans = pow(3, num3);     // 此处为正好余3为
    		if(number % 3 != 0){         // 如果余3为2
    			ans = ans * 2;       // 最终结果乘2
    		}
    	}
    	return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值