[LeetCode][LCR131]砍竹子 I——推测规律

题目

LCR 131. 砍竹子 I

现需要将一根长为正整数 bamboo_len 的竹子砍为若干段,每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。

  • 示例 1:

输入: bamboo_len = 12
输出: 81

  • 提示:

2 <= bamboo_len <= 58

注意:本题与主站 343 题相同:Integer Break

思考

  • 本题意思为:将给定的数字 n 分解为几个整数加数,返回可能的最大的加数乘积
  • 初看这道题没有任何思路,尝试不同的数字,尝试推测出规律
//推测最大的乘积
12 -> 3*3*3*3=81
13 -> 3*3*3*4=108
14 -> 3*3*3*3*2=162
15 -> 3*3*3*3*3=243
16 -> 3*3*3*3*4=324
...
  • 到这里基本可以看出,应该是拆分出来的 3 越多乘积越大,数学直觉推测出这应该和 e 有关,3 是比 2 更接近 e 的正整数,于是可以直接写出代码
  • 具体数学推导见:https://leetcode.cn/leetbook/read/illustration-of-algorithm/lxagkg/

解法1

  • 通过列出不同的例子推测出规律,尽可能多拆分 3
  • 如果拆 3 拆到最后余 1,由于 1 在乘法里不起作用,所以将最后一个 3 加 1 变为 4 进行拆分
  • 如果余 2,则直接乘 2 即可,因为如果不拆分为 3*2,而是拆为 5,由于 32>5
  • 然后再处理一些特殊情况即可,由于一定要拆成至少两份,则2=1,1、3=1,2、4=2,2

class Solution {
public:
    int cuttingBamboo(int n) {
        if(n==2) return 1;
        if(n==3) return 2;
        if(n==4) return 4;
        int a=n%3;
        int b=(n-a)/3;
        if(a) return a==1 ? pow(3, b-1)*4 : pow(3, b)*a;
        return pow(3, b);
    }
};

相关推荐

  1. [LeetCode][LCR131]竹子 I——推测规律

    2024-04-09 15:24:04       35 阅读
  2. 蓝桥杯 2022 省 B 洛谷 P8787 竹子

    2024-04-09 15:24:04       45 阅读
  3. LeetCodeLCR 114. 火星词典——拓扑排序

    2024-04-09 15:24:04       50 阅读
  4. 算法篇:动态规划I

    2024-04-09 15:24:04       42 阅读
  5. 2霸主MOD开发(11)-瓦兰迪亚火骑兵

    2024-04-09 15:24:04       30 阅读
  6. <span style='color:red;'>砍</span>树c++

    树c++

    2024-04-09 15:24:04      34 阅读
  7. EKO /

    2024-04-09 15:24:04       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 15:24:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 15:24:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 15:24:04       82 阅读
  4. Python语言-面向对象

    2024-04-09 15:24:04       91 阅读

热门阅读

  1. 地理处理和空间分析的关键技巧

    2024-04-09 15:24:04       31 阅读
  2. vs mfc未加载mfc140u导致无法启动

    2024-04-09 15:24:04       28 阅读
  3. 第3章 数据定义语言DDL

    2024-04-09 15:24:04       28 阅读
  4. 第一弹:HTML,学习记录

    2024-04-09 15:24:04       28 阅读