AtCoder Beginner Contest 100 C(思维)

Posted kaleidoscope233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 100 C(思维)相关的知识,希望对你有一定的参考价值。

*3 or /2
题目大意:有n个数,每次操作将第i个数*3或/2,得到结果必须为整数,且每次操作必须有一次为/2,求最大操作次数.
一开始看很懵比,感觉肯定是思维题,对着样例猜了个结论竟然就过了大数据。。。
思路:奇数只能 * 3,所以只考虑偶数.对于一个偶数,可以分解成2^n * a,显然a为奇数,那么如果这个偶数乘3为2^n * 3a,3a也显然为奇数,所以证得:任意一个偶数无论乘多少次3它能/2的次数仍然为n不变.
由于次数最大,所以每次只让一个偶数/2。
所以答案就是统计每个偶数为2^n * a中n的和。

技术分享图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <queue>
 6 #define ll long long
 7 #define out(a) printf("%d",a)
 8 using namespace std;
 9 int n,cnt; 
10 int a[100050];
11 int read()
12 {
13     int s=0,t=1; char c;
14     while (c<0||c>9){if (c==-) t=-1; c=getchar();}
15     while (c>=0&&c<=9){s=s*10+c-0; c=getchar();}
16     return s*t;
17 }
18 int main()
19 {
20     n=read();
21     for (int i=1;i<=n;i++)
22       a[i]=read();
23     for (int i=1;i<=n;i++)
24       if (a[i]%2==0) {
25         while (true) {
26           if (a[i]%2==0) cnt++,a[i]/=2;
27           else break;
28         }
29     }
30     out(cnt);
31     return 0;
32 }
View Code

 






以上是关于AtCoder Beginner Contest 100 C(思维)的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242