码迷,mamicode.com
首页 > 其他好文 > 详细

AtCoder Beginner Contest 100 C(思维)

时间:2018-07-07 17:46:59      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:follow   space   大数   mat   test   namespace   display   分解   target   

*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(思维)

标签:follow   space   大数   mat   test   namespace   display   分解   target   

原文地址:https://www.cnblogs.com/Kaleidoscope233/p/9277274.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!