(CodeForces 558C) CodeForces 558C
题目链接:http://codeforces.com/problemset/problem/558/C
题意:给出n个数,让你通过下面两种操作,把它们转换为同一个数。求最少的操作数。
1.ai = ai*2
2.ai = ai/2,向下取整
思路:
可以除以二 或者 乘以二,就相当于位运算的右移和左移。用两个数组,vis 数组, cnt 数组。刚开始都初始化为0; vis[i] 表示 i 这个数可以由几个数转化而来,cnt[i] 表示题目给出的 n 个数全部转化为 i 需要的操作数。
首先遍历数组找到 ai 的最大值记为 MAX,那么所有数转化的上界就是 MAX,因为如果最终转化的数如果大于MAX,那么所有值都要转化为大于MAX的那个数,很明显这不是最后的答案。
把一个数表示为二进制数,
1、如果最低位是0,那么这个数右移一位(除以2),再左移一位(乘以2),就得到原来的数
2、如果最低位是1,那么这个数右移一位(除以2),再左移一位(乘以2),得不到原来的数
那么:
3要转化为8,最少需要4步操作,先除以2,再乘以2,再乘以2,再乘以2
2要转化为8,最少需要2步操作,先乘以2,再乘以2
处理一个数 ai:
1、对 ai 执行左移操作,记录 ai 通过左移能够得到的数字,上限为MAX,vis 数组加1,cnt数组记录步数
2、对 ai 执行右移操作,直到 ai 为0
若 ai 的最低位为1,右移一步之后,进行左移,上限为MAX,维持vis数组和cnt数组
若 ai 的最低位为0,右移一步,维持vis数组和cnt数组
这样我们就把一个数的所有情况都处理出来了,并且是最少的操作数。
最后遍历数组找 vis[i] 为n,并且操作数最小。
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
- #include <math.h>
- #include <algorithm>
- #include <queue>
- using namespace std;
- #define INF 0x3f3f3f3f
- #define met(a,b) memset(a,b,sizeof(a))
- #define ll long long
- #define N 100010
- int m,vis[N*];///有多少数通过乘以2或除以2能到i
- int te[N*];///统计到i需要多少步
- int a[N*];
- void add(int s)
- {
- vis[s]++;
- int a=s,b=s;
- int h=,k=;
- while(a<=m)///往上乘不能超过最大值
- {
- a=a<<;
- h++;
- vis[a]++;
- te[a]+=h;
- }
- while(b)
- {
- if(b& && b!=)///如果二进制末尾是1除以2再乘以2不是原来的数
- {
- b=b>>;
- k++;
- vis[b]++;
- te[b]+=k;
- int k1=k;
- int d=b;
- while(d<=m)
- {
- d=d<<;
- k1++;
- vis[d]++;
- te[d]+=k1;
- }
- }
- else
- {
- b=b>>;
- k++;
- vis[b]++;
- te[b]+=k;
- }
- }
- }
- int main()
- {
- int n;
- scanf("%d",&n);
- for(int i=;i<n;i++)
- {
- scanf("%d",&a[i]);
- m=max(m,a[i]);
- }
- met(vis,);met(te,);
- for(int i=;i<n;i++)
- add(a[i]);
- int ans=INF;
- for(int i=;i<N*;i++)
- {
- if(vis[i]==n)///需要所有的数都能到i
- ans=min(ans,te[i]);///取最小步数
- }
- printf("%d\n",ans);
- return ;
- }
(CodeForces 558C) CodeForces 558C的更多相关文章
- (水题)Codeforces - 4C - Registration system
https://codeforces.com/problemset/problem/4/C 用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间. ...
- (水题)Codeforces - 327C - Magic Five
https://codeforces.com/problemset/problem/327/C 因为答案可以有前导零,所以0和5一视同仁.每个小节内,以排在第 $i$ 个的5为结尾的序列即为在前面 $ ...
- (水题)Codeforces - 650A - Watchmen
http://codeforces.com/contest/650/problem/A 一开始想了很久都没有考虑到重复点的影响,解欧拉距离和曼哈顿距离相等可以得到 $x_i=x_j$ 或 $y_i=y ...
- (水题)Codeforces - 630H - Benches
https://codeforces.com/problemset/problem/630/H 又一个组合数学的问题,我们先考虑在 $n$ 列中选出 $5$ 列来放椅子,然后对第一列有 $n$ 种放法 ...
- 网络流(费用流)CodeForces 321B:Ciel and Duel
Fox Ciel is playing a card game with her friend Jiro. Jiro has n cards, each one has two attributes: ...
- 网络流(最大流)CodeForces 512C:Fox And Dinner
Fox Ciel is participating in a party in Prime Kingdom. There are n foxes there (include Fox Ciel). T ...
- 网络流(最大流) CodeForces 546E:Soldier and Traveling
In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...
- 点分治 (等级排) codeforces 321C
Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, has n cities connected ...
- Codeforces 746D:Green and Black Tea(乱搞)
http://codeforces.com/contest/746/problem/D 题意:有n杯茶,a杯绿茶,b杯红茶,问怎么摆放才可以让不超过k杯茶连续摆放,如果不能就输出NO. 思路:首先,设 ...
随机推荐
- 剑指OFFER之树的子结构(九度OJ1520)
题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1< ...
- SQLite使用教程9 Select 语句
http://www.runoob.com/sqlite/sqlite-select.html SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获 ...
- js获取上传文件内容(未完待续)
js 获取上传文件的字节数及内容 <div> 上传文件 : <input type="file" name = "file" id = &qu ...
- xcopy拷贝判断是否成功 robocopy排除子目录
xcopy \\172.16.22.65\server\*.* C:\Inetpub\wwwroot\Server /h /r /s /yif %errorlevel% neq 0 echo copy ...
- Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)
介绍规则body怎样和图片结合.上一篇文章我介绍了box2D的基本知识,假设你用心的话.你会搜索网上相关简单demo吧.那些我就不写了.那么假设我用图片表示我的那个body.而不是简单线条.那该怎么办 ...
- Microsoft Visual Studio与Firefly 加载的项目已建议,更新源代码地位问题
一开始装笔记本vs2010,由于使用的近期发展vs2008与vs2005所以,今天再次2008.2005安装在,但是在打开的项目时,,首先提示加载项目文件.然后已建议状态,非常慢非常慢的,之前仅仅有v ...
- 如何把 excel 设为文本格式?
选择要设置的单元格,右键选择 --- “设置单元格格式” --- 选 “ 分类 ” 下面的 “ 文本 ” --- 确定. 修改前: 修改后:
- Memcached source code analysis (threading model)--reference
Look under the start memcahced threading process memcached multi-threaded mainly by instantiating mu ...
- 显示/去掉CONSOLE窗口
众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种 ...
- 路径(keyPath)、键值编码(KVC)和键值观察(KVO)
键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...