题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2379
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意:我们每次可以消掉一半,为什么呢;比如是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;递归到最后就行了;所以得到递归序列:f(k)=f(k/2)+1;
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; int ned(int i){ if(i==1) return 1; return ned(i/2)+1; } int main(void){ int b =0; while(~scanf("%d",&b)){ printf("%d\n",ned(b)); } return 0; }