Problem Description
Wyb is a VERY VERY BIG fans of Naruto(漩涡鸣人). Naruto's perseverance and passion attract him a lot, so does Naruto's skill "Kagebunsin no jyutu"(影分身术). Actually, wyb knows more details about "Kagebunsin no jyutu" than most of us. When Naruto makes an new illusion(幻象), his Chakra will divide into two parts A and B, and increase Naruto's weariness value by absolutely value of (A - B).
For example, at first Naruto have 5 Chakra, then he makes an illusion who has 2 Chakra. So he left 3 Chakra, and increase his weariness value by 1 (3 - 2). If he make a new illusion again and give him 2 Chakra, then he only left 1 Chakra and his weariness value changes to 2. Naruto cannot make a new illusion unless his Chakra is bigger than 1. What's more, Naruto's illusion can also use "Kagebunsin no jyutu" and the weariness they gains will also return to Naruto himself.
Now Naruto wants to make as many illusions as he can because Kakashi Sensei wants to teach him a new Ninjyutsu(忍术) and minimum his weariness value.
For example, at first Naruto have 5 Chakra, then he makes an illusion who has 2 Chakra. So he left 3 Chakra, and increase his weariness value by 1 (3 - 2). If he make a new illusion again and give him 2 Chakra, then he only left 1 Chakra and his weariness value changes to 2. Naruto cannot make a new illusion unless his Chakra is bigger than 1. What's more, Naruto's illusion can also use "Kagebunsin no jyutu" and the weariness they gains will also return to Naruto himself.

Now Naruto wants to make as many illusions as he can because Kakashi Sensei wants to teach him a new Ninjyutsu(忍术) and minimum his weariness value.
Input
The first line of input contains an integer T, indicating the number of test cases, then T lines follow , each line contains a positive integer N, indicating the number of Naruto's Chakra.
0 < N < 10000000;
0 < N < 10000000;
Output
For each case ,output the minimum weariness value of Naruto when he makes the most illusions.
Sample Input
2 5 9
Sample Output
2 3
分析:此题最好用递归, 动态规划容易超时 最好不用数组 HDU 一道水题 研究了一下午 以后的动态规划不用看了 直接上递归 。 递归是最好用数组 (备忘法 )也可以不用
下午测试了 用不用数组此题都AC 话不多说 直接上代码
#include <stdio.h>
#include <string.h>
int dg(long n)
{/*
if(n<10001&&a[n]!=-1)
{
return a[n];
}
if(n<10001)
{
if(n%2==0)
return a[n]=dg(n/2)*2;
else
return a[n]=dg(n/2)+dg(n-n/2)+1;
}
else
{
if(n%2==0)
return dg(n/2)*2;
else
return dg(n/2)+dg(n-n/2)+1;
}*/
if(n==1||n==2||n==0)
return 0;
if(n%2==0)
return dg(n/2)*2;
else
return dg(n/2)+dg(n-n/2)+1;
}
int main(int argc, char* argv[])
{
int n;
int i;
long num;
scanf("%d", &n);
memset(a,-1, sizeof(a));
a[0]=a[1]=a[2]= 0;
for (i = 0; i < n; i++)
{
scanf("%ld", &num);
printf("%ld\n", dg(num));
}
return 0;
}
注释部分是用了数组 节约时间 此题不用也可以过。