思路:找规律
分析:
1 题目说给定一个小于10^9的数,现在有n个数要求经过最少的步骤使得这个序列的所有数都为0,求这个最少的步骤
2 很明显的找规律题,题目明确说明每一次可以选择任意个的数减去一个正整数,那么我们看以下这个例子
1 2 3 4 5 6 = (1 2 3 (4 5 6)-4) +1 = (1 2 3 0 1 2) +1
那么我们根据题目的意思我们可以知道每一次可以选择多个相同的数进行减去一个数,那么所有相同的数实际上是同时消去的,那么这个序列1 2 3 0 1 2等价于 1 2 3 (0可以不用考虑)
那么我们假设n = 6时候为f(6),那么f(6) = f(3)+1.
3 那么推广所有的n,那么f(n) = f(n/2)+1,n = 1的时候f(1) = 1
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int getAns(int n){ return n == 1 ? 1 : getAns(n/2)+1; } int main(){ int n; while(scanf("%d" , &n) != EOF) printf("%d\n" , getAns(n)); return 0; }