题意:给定正整数n,任务是用最小的操作次数把序列1,2,3……n中所有数边为0,每次操作可以选一到多个整数,同时减去一个正整数。
方法:例n == 6时,同时减去后边一半最小那个,也就是4,变成了1 2 3 0 1 2,然后就和操作 1 2 3 是一样的了,所以 f(6) = f(3) + 1,所以 f(n) = f(n/2)+ 1.递归就行,边界是n == 1。
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
using namespace std;
int fun(int n)
{
return n == 1? 1 : fun(n/2) + 1;
}
int main()
{
#ifdef Local
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
#endif
int n = 0;
while (cin >> n)
cout << fun(n) << endl;
}