题目:给你1~n,n个连续的整数,每次可以从里面取出人一个数字减去一个任意数,
问最少操作多少次可以全变成0。
分析:分治,递推。如果从1~n,任意取k个数字减去p,得到的新数字或者是连续的或者不连续。
如果不连续,可以映射到连续的,操作次数不变(减数每次加上间隔的长度即可);
所以都可以看成是连续的处理,而连续的情况下,重复的数字越多越好,因此p为n/2;
说明:清晰证明请查看W4anD0eR96给出的证明:http://blog.csdn.net/w4and0er96/article/details/51731110。
#include <cstdio>
int f(int n)
{
return n>1?f(n>>1)+1:1;
}
int main()
{
int n;
while (~scanf("%d",&n))
printf("%d\n",f(n));
return 0;
}