1.题目描述:点击打开链接·
2.解题思路:本题属于找规律题。通过多次尝试,可以发现,我们可以每次让所有大于n/2都减去n/2,这样得到的结果等价于序列1~n/2,令f(n)表示序列1~n的操作次数,那么f(n)=f(n/2)+1。边界是f(1)=1。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; int f(int n) { return n == 1 ? 1 : f(n / 2) + 1; } int main() { //freopen("t.txt", "r", stdin); int n; while (~scanf("%d", &n)) printf("%d\n", f(n)); return 0; }