切分木头

切分木头

题目如下

假设要把长度为n厘米的木棒切分为1厘米长的小段,但是1根木棒只能由1人切分。当木棒被切分为3段后,可以同时由3个人分别切分木棒。求最多有m个人时,最少要切分几次。譬如n=8,m=3时,切分4次就可以了。

问题

求当n=100,m=5时的最少切分次数。

思路

n厘米长的木头,需要切n-1刀才能得到全是1厘米长的小段。把切分木头的情形分为两种,人等木头和木头等人。第一种情形的切分数量就是所有被切分的木头的总数,第二种情形的切分数量就是总刀数减去第一种情形的数再与人数去分别相除和求余,最后两者相加。

我的解题代码

切分木头

public int qieGeMu(int n, int m) {//n是木头总长度,m是人数。
        int base = 0;
        int num = 0;
        for (int i = 0; i < 50; i++) {
            base += Math.pow(2, i);
            if (m >= i * i && m < ((i + 1) * (i + 1))) {
                num = i + 1;//for循环是从0开始的,而这里要的是人等木头的最大次数,所以加1。
                break;
            }
        }
        int diff = n - 1 - base;
        int re = diff / m;
        int yu = diff % m;
        return yu == 0 ? (num + re) : (num + re + 1);
    }

测试用例

    @Test
    public void qieGeMuTou() {
        int n = 100;
        int m = 5;
        System.out.println("当n=" + n + ",m=" + m + "时的最少切分次数为:" + qieGeMu(n, m));
    }

程序运行结果如下
当n=100,m=5时的最少切分次数为:22

总结

这道题给出的目标作答时间为10分钟,而自己多用了好几倍时间,看来得加把劲了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值