Codeforces-579A
Raising Bacteria
Codeforces Round #320 (Div. 2) [Bayan Thanks-Round]
Time Limit:1000ms Memory Limit:262144 kB
-
问题描述
你是一个细菌爱好者。你想在一个盒子里培养一些细菌。起初,这个盒子是空的。每天早上,你可以在盒子里放任意数量的细菌;每天晚上,细菌将会繁殖,一分为二。你在某些时候,希望看到正好$x$个细菌。这些天内,你需要放至少多少个细菌呢?
输入
一个正整数$x$($1≤x≤10^9$)
输出
唯一的正整数:答案。
-
样例
Example 1:
Input
5
Output
2
Example 2
Input
8
Output
1
-
这题本身不难,主要是要看懂题目的意思。题目比较巧合的地方是,细菌只能一分二繁殖。$k$天内,一个细菌就可能变成$2^k$个,因此,最后要得到$x$个细菌,只要$x=\sum_{n=1}^{N}t_i·2^{k_i}$成立;若初始细菌数量最少,则系数 $t_i$ 都为1。这与无符号整数的表示非常神似,因此可以使用位操作的方法来解。当然直接进行求解也是可以的。
1 #include<iostream> 2 int main() 3 { 4 using namespace std; 5 int n; 6 cin >> n; 7 int count = 0; 8 int sn = 536870912; 9 for (;;) 10 { 11 if (n == 0) 12 break; 13 if (n / sn != 0) 14 count++; 15 n = n % sn; 16 sn /= 2; 17 } 18 cout << count; 19 return 0; 20 }