剑指 offer acwing 25 剪绳子 (数学)

题面

在这里插入图片描述

题解

  1. 这是一道经典的数学结论问题,先说结论,就是我们剪的长度只有2和3两种,而且2最多为2个,当绳子的长度模3余1时,绳子长度为2个2,其余都是3;模3余2时,有一段是2,其余都是3
  1. 证明 :当一段 ai >=5 时,那么我们就可以拆分成 (ai-3) *3 = 3 *ai - 9 ,我们假设3 *ai -9 >ai ,那么 2 *ai > 9 -----> ai > 4.5 假设成立 ,现在每段长度都不大于5
  1. 在看4的情况 ,对于4 ,我们可以拆分成 2 * 2 ,所有也不含有 4 ,因为1 对乘积的贡献值为0 ,所有肯定不会选1 ,现在每段长度都只有2 3
  1. 假设 有 3 个2 ,那么 2 * 2 *2 < 3 * 3 ,所以长度为6的剪成 3 * 3才是最优的,所以2 的个数不会超过3

代码

class Solution {
    
    
public:
    int maxProductAfterCutting(int n) {
    
    
        
        if(n<=3) return 1*(n-1);
        
        int res=1;
        if(n%3==1) res*=4 ,n-=4;
        if(n%3==2) res*=2, n-=2;
        while(n) res*=3,n-=3;
        
        return res;
        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44791484/article/details/114919216