题目描述
薯片这次又遇到问题了==
薯片有n个薯条棒,第i个薯条棒的长度为i,由于薯片能瞬间移动,所以薯片能在1秒内从这n个薯条棒里面选择一个或者多个,吃掉同样长的一部分,
并且被吃掉部分的长度是正整数,问薯片至少多少时间能把这n个薯条棒都吃完?
输入
多组数据输入,每组数据第一行输入一个n(1<=n<=109).
输出
对于每组数据,输出最短的时间.
样例输入
3
4
样例输出
2
3
提示
题解:应用递归 其实最开始同时吃掉的长度是n/2,也就是中间那个薯条的长度 除去第一步,剩下的次数也就是吃掉n/2根薯条的次数,即f[n]=f[n/2]+1
同理可推出:f[n]=f[n/2/2]+1+1=f[n/4]+2;
#include<cstdio>
#include<cstring>
#include<cstdlib>
long long f(long long n)
{
long long t;
if(n==1) return 1;
else if(n==2) return 2;
else if(n==3) return 2;
else if(n==4) return 3;
else return f(n/4)+2;
}
int main()
{
int n;
while(~scanf("%lld",&n))
{
printf("%lld\n",f(n));
}
return 0;
}