题目
多多鸡有N个魔术盒子(编号1~N),其中编号为i的盒子里有i个球。
多多鸡让皮皮虾每次选择一个数字X(1 <= X <= N),多多鸡就会把球数量大于等于X个的盒子里的球减少X个。
通过观察,皮皮虾已经掌握了其中的奥秘,并且发现只要通过一定的操作顺序,可以用最少的次数将所有盒子里的球变没。
那么请问聪明的你,是否已经知道了应该如何操作呢?
思路
思路:每次是大于等于X个盒子里的球减少X个,所以如果我们选择最大的N作为X,那么去除的就是 N*1个 ,我们可以把它看做矩形
为了使得矩形的面积最大化,我们不可不断缩减两边的距离,使之趋向于正方形,于是,选取N/2作为点最合适。取完一次后,后面的数
会是依次变为0,1,2…直到N/2-1.然后第一次取剩下的是1-N/2.所以,我们要考虑的就只是1-N/2即可【个数重复不会造成影响】,
一直递归即可。
代码
import java.util.Scanner;
public class MagicBox {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int num=reader.nextInt();//盒子数目
int nums[]=new int[num];//各组的个数
for(int i=0;i<nums.length;++i)
{
nums[i]=reader.nextInt();
}
int test=0;
for (int i=0;i<nums.length;++i)
{
// int a=1;
// while((int)Math.pow(2,a)<=nums[i])
// {
// ++a;
// }
// System.out.println(a);
// 这种方法也可,不过比较慢
int count=0;
int a=1;
while(a<=nums[i])
{
a=a<<1;//右移动一位
++count;
}
System.out.println(count);
}
}
}
总体上看来,经过了多次测试,还是第二种方法速度快一点。
第一种方法测试:
第二种方法测试: