C. Amr and Chemistry

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experiment.

Amr has n different types of chemicals. Each chemical i has an initial volume of ai liters. For this experiment, Amr has to mix all the chemicals together, but all the chemicals volumes must be equal first. So his task is to make all the chemicals volumes equal.

To do this, Amr can do two different kind of operations.

  • Choose some chemical i and double its current volume so the new volume will be 2ai
  • Choose some chemical i and divide its volume by two (integer division) so the new volume will be 

Suppose that each chemical is contained in a vessel of infinite volume. Now Amr wonders what is the minimum number of operations required to make all the chemicals volumes equal?

Input

The first line contains one number n (1 ≤ n ≤ 105), the number of chemicals.

The second line contains n space separated integers ai (1 ≤ ai ≤ 105), representing the initial volume of the i-th chemical in liters.

Output

Output one integer the minimum number of operations required to make all the chemicals volumes equal.

Examples
input
3
4 8 2
output
2
input
3
3 5 6
output
5

Note

In the first sample test, the optimal solution is to divide the second chemical volume by two, and multiply the third chemical volume by two to make all the volumes equal 4.

In the second sample test, the optimal solution is to divide the first chemical volume by two, and divide the second and the third chemical volumes by two twice to make all the volumes equal 1.

//题意是,给你n个整数,每一个整数可以进行两种操作,除2(取整)或者乘2.每个整数可以进行任意次这样的操作。

使这n个整数都变为相同的整数最少需要多少次操作。

//暴力bfs   1292kb 607ms

//还是需要一点技巧的...

 #include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std; int n,max_;
int num[];
int times[];//有几个值可以到这个数
int vis[];//所有值变成这个值需要的操作数 struct Step
{
int e;//值
int s;//步数
}; bool v[];//暂时用来bfs的
void func(int x)
{
queue<Step> Q;
memset(v,,sizeof(v)); Step k;
k.e=x;
k.s=; Q.push(k);
times[k.e]++;
v[k.e]=; while (!Q.empty())
{
k=Q.front();
Q.pop();
Step next;
next.e=k.e*;
next.s=k.s+;
if (next.e<=&&v[next.e]==)
{
vis[next.e]+=next.s;
times[next.e]++;
v[next.e]=;
Q.push(next);
}
next.e=k.e/;
if (next.e>=&&v[next.e]==)
{
vis[next.e]+=next.s;
times[next.e]++;
v[next.e]=;
Q.push(next);
}
}
} int main()
{
scanf("%d",&n);
int i,j;
for (i=;i<n;i++)
scanf("%d",&num[i]); //memset(vis,0,sizeof(vis));
//memset(times,0,sizeof(times));
for (i=;i<n;i++)
{
func(num[i]);//每个点可以去的地方
}
int ans=1e8;
for (i=;i<=;i++)
{
if (times[i]==n&&vis[i]<ans)//那个值必须要有n个数可以到,
ans=vis[i];
}
printf("%d\n",ans);
return ;
}

更好的做法  984kb 46ms

//别人的,还未仔细看...

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX = 1e5 + ; int num[MAX];
int cnt[MAX];
int a[MAX];
const int up = 1e5;
const int inf = 0x3f3f3f3f;
int main()
{
int n;
while(~scanf("%d", &n)){
memset(num, , sizeof(num));
memset(cnt, , sizeof(cnt));
for(int i = ; i <= n ; i++)
scanf("%d", &a[i]);
for(int i = ; i <= n ; i++){
int x = a[i];
int pre = ;
while(x){
int s = ;
while(x % == ){
x /= ;
s++;//从当前偶数到最后的奇数移动的步数
}
int y = x;
int x1 = ;
while(y <= up){
cnt[y]++;//可以得到的值
num[y] += pre + abs(s - x1);
x1++;
y *= ;
}
pre += s + ;//达到该值已经走过的步数,在接着处理一步+1
x /= ;
}
}
int ans = inf;
for(int i = ; i <= up ;i++){
if(cnt[i] == n){
ans = min(ans, num[i]);
}
}
printf("%d\n", ans);
}
return ;
}

Amr and Chemistry的更多相关文章

  1. 暴力 + 贪心 --- Codeforces 558C : Amr and Chemistry

    C. Amr and Chemistry Problem's Link: http://codeforces.com/problemset/problem/558/C Mean: 给出n个数,让你通过 ...

  2. Codeforces Round #312 (Div. 2) C. Amr and Chemistry 暴力

    C. Amr and Chemistry Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/558/ ...

  3. Codeforces Round #312 (Div. 2) C.Amr and Chemistry

    Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experime ...

  4. Codeforces 558C Amr and Chemistry 暴力 - -

    点击打开链接 Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input stan ...

  5. CF 558 C. Amr and Chemistry 暴力+二进制

    链接:http://codeforces.com/problemset/problem/558/C C. Amr and Chemistry time limit per test 1 second ...

  6. codeforces 558C C. Amr and Chemistry(bfs)

    题目链接: C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input st ...

  7. C. Amr and Chemistry(Codeforces Round #312 (Div. 2) 二进制+暴力)

    C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. 【23.39%】【codeforces 558C】Amr and Chemistry

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. Amr and Chemistry CodeForces 558C(BFS)

    http://codeforces.com/problemset/problem/558/C 分析:将每一个数在给定范围内(10^5)可变成的数(*2或者/2)都按照广搜的方式生成访问一遍,标记上访问 ...

随机推荐

  1. django自定义过滤器及模板标签

    创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ...

  2. Java中hashcode的理解

    Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...

  3. javascript 中event是全局变量

    The only thing I can think of is that event is in fact window.event and it makes itself available wh ...

  4. Intellij output 中文乱码

    使用intellij有一段时间了,intellij output中文乱码,每次使用这两点解决,就可以解决乱码问题. 1.修改启动参数 修改安装Intellij目录下的C:\Program Files ...

  5. openlayers对接百度地图新方法

    上次给大家提供的openlayers对接百度地图有些问题,是因为没有进行分辨率设置,也没有进行相应的平面坐标转换,获取getURL的方法还是没有变化的 getURL: function (bounds ...

  6. rsync详解之exclude排除文件(转)

    rsync详解之exclude排除文件 问题:如何避开同步指定的文件夹?  --excludersync  --exclude files and folders http://articles.sl ...

  7. ABP框架EF6链接Oracle数据库手动迁移

    环境:VS2017 + ABP官方模板(不含Zero) +Oracle 11Gx64DB  + Oracle 11Gx32Client(PLSQL工具访问) 一.Abp项目的下载以及运行 1.创建ab ...

  8. 操作REDIES

    import redis r=redis.Redis(host='118.XX.XX.XXX',password='XXXXXXX9*',db=1,port=6379) # 增删改查r.set('jd ...

  9. 1 android 人脸识别

    1 https://www.google.com.hk/search?newwindow=1&safe=strict&q=android+%E5%9B%BE%E7%89%87%E4%B ...

  10. 转 SQL行转列汇总

    1.PIVOT 用于将列值旋转为列名(即行转列) PIVOT 的一般语法是:PIVOT(聚合函数(列名) FOR 列名 in (列值1,…) )AS P select * from TB pivot ...