题意:
有一个1到n的序列,你一次从这个序列中取出几个数字,把他们减去同一个数,问最少做几次,全部变成0;
思路:
我们每次可以消掉一半,为什么呢;
比如是1到10,那么我们第一次把6 到10同时减去5,那么剩下的就是1到5了是不是;
也就是序列成为了1,2,3,4,5,1,2,3,4,5;
那么在操作也就是不同的数字只剩下5个了,把1消为0,也就会同时把两个1都消为0;
有一个1到n的序列,你一次从这个序列中取出几个数字,把他们减去同一个数,问最少做几次,全部变成0;
思路:
我们每次可以消掉一半,为什么呢;
比如是1到10,那么我们第一次把6 到10同时减去5,那么剩下的就是1到5了是不是;
也就是序列成为了1,2,3,4,5,1,2,3,4,5;
那么在操作也就是不同的数字只剩下5个了,把1消为0,也就会同时把两个1都消为0;
所以f(10) = f(5) +1;递归到最后就行了;
AC:
#include<cstdio>
#include<cstring>
int n;
int f(int x) {
return x == 1 ? 1 : f(x / 2) + 1;
}
int main () {
while(~scanf("%d",&n)) {
printf("%d\n" , f(n));
}
return 0;
}