Amr and Chemistry
C. Amr and Chemistry
1 second
256 megabytes
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?
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 one integer the minimum number of operations required to make all the chemicals volumes equal.
3
4 8 2
2
3
3 5 6
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的更多相关文章
- 暴力 + 贪心 --- Codeforces 558C : Amr and Chemistry
C. Amr and Chemistry Problem's Link: http://codeforces.com/problemset/problem/558/C Mean: 给出n个数,让你通过 ...
- 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/ ...
- Codeforces Round #312 (Div. 2) C.Amr and Chemistry
Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experime ...
- Codeforces 558C Amr and Chemistry 暴力 - -
点击打开链接 Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input stan ...
- CF 558 C. Amr and Chemistry 暴力+二进制
链接:http://codeforces.com/problemset/problem/558/C C. Amr and Chemistry time limit per test 1 second ...
- 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 ...
- 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 ...
- 【23.39%】【codeforces 558C】Amr and Chemistry
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Amr and Chemistry CodeForces 558C(BFS)
http://codeforces.com/problemset/problem/558/C 分析:将每一个数在给定范围内(10^5)可变成的数(*2或者/2)都按照广搜的方式生成访问一遍,标记上访问 ...
随机推荐
- python 常用的模块(hashlib)转
摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串( ...
- 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-3 读写注册表
读写注册表和读写文件一样,里面涉及的输入类型比较复杂,需要参考官方范例 sSubKey是指注册表的路径 sValName是指注册表要写入的名值对的名称 eValType是一个枚举类型(而且不是什么常规 ...
- python可hash 不可hash类型
不可变类型是可hash #tuple str freezeset 可变类型是不可hash ##list set
- Android应用程序快速更换包名的方法
今天遇到需要修改Android包名的问题,开始试了直接修改包名,会出现一些错误 1.layout中直接引用类的地方 2.Manifest中对gen定义的地方 经测试,总结出一下方法: 1.关闭自动编译 ...
- maven生成jar包
改了部分cas源码,想重新生成jar包,只好试着脱离eclipse,学了一下maven打jar包的命令,记录如下: 1.首先下载maven (请注意自己的jdk版本,如果使用maven2建议使用jdk ...
- 自己定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)
转载请注明出处王亟亟的大牛之路 之前也有一个相似于画板的操作,可是不够具体,这边先补上链接.有兴趣的小伙伴能够看看http://blog.csdn.net/ddwhan0123/article/det ...
- 通过rinetd实现端口转发,同时访问阿里云RDS的内外网
配置方法如下: 1 wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz& ...
- 前端自动化Grunt教程
最近在学习Bootstrap,了解一部分之后,发现Bootstrap使用了LESS,好嘛,开始学习LESS,LESS了解部分,发现自动编译工具Grunt,了解Grunt过程发现需要使用node.js的 ...
- Android下Sqlite的使用(9.7)
1 http://blog.csdn.net/liuhe688/article/details/6715983 2 http://www.eoeandroid.com/thread-170715-1- ...
- C#中执行存储过程并在SQL server中调试
1.编写存储过程 ) drop PROCEDURE [dbo].[sp_calcPci_of_baseRcd_GTmpTbl] CREATE PROCEDURE [dbo].[sp_calcPci_o ...