切分木头
题目如下
假设要把长度为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分钟,而自己多用了好几倍时间,看来得加把劲了。