题解
我们对于$n$,保留$lfloor {n over 2} floor$,以上的部分减去$lceil {n over 2} ceil$这样每次将区间缩小$1 over 2$,保证最优解。
1 //It is made by Awson on 2017.9.16 2 #include <map> 3 #include <set> 4 #include <cmath> 5 #include <ctime> 6 #include <queue> 7 #include <stack> 8 #include <cstdio> 9 #include <string> 10 #include <vector> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 #define LL long long 16 #define Max(a, b) ((a) > (b) ? (a) : (b)) 17 #define Min(a, b) ((a) < (b) ? (a) : (b)) 18 #define Abs(a) ((a) < 0 ? (-(a)) : (a)) 19 using namespace std; 20 21 int n; 22 23 int f(int n) { 24 return n != 1 ? f(n/2)+1 : 1; 25 } 26 void work(int n) { 27 printf("%d ", f(n)); 28 } 29 int main() { 30 while (~scanf("%d", &n)) 31 work(n); 32 return 0; 33 }