0
点赞
收藏
分享

微信扫一扫

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


C. Amr and Chemistry



time limit per test



memory limit per test



input



output


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

n different types of chemicals. Each chemical i has an initial volume of ai

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

  • i and double its current volume so the new volume will be 2ai
  • 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



n (1 ≤ n ≤ 105), the number of chemicals.

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.


Sample test(s)



input



3 4 8 2



output



2



input



3 3 5 6



output



5


Note



4.

1.

题意:给定n长的序列,每次可以选一个数 让其 乘以2 或者 除以2,问至少操作多少次使得所有数相等。

点击打开链接

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

using namespace std;

int a[1000050];
int num[1000010];
int v[10000060];
int maxx;
int n;

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(num,0,sizeof(num));
        memset(v,0,sizeof(v));
        maxx = -1;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            v[a[i]]++;
            if(maxx<a[i])
            {
                maxx = a[i];
            }
        }
        for(int i=0; i<n; i++)
        {
            int t = a[i];
            int cnt = 0;
            while(t<maxx)
            {
                t = t<<1;
                cnt++;
                v[t]++;
                num[t] += cnt;
            }
            cnt = 0;
            int pp;
            t = a[i];
            while(t>0)
            {
                int flag = 0;
                if(t%2 == 1 && t!=1)
                {
                    flag = 1;
                }
                t = t>>1;
                cnt++;
                v[t]++;
                num[t] += cnt;
                if(flag == 1)
                {
                    pp = t;
                    int pcnt = cnt;
                    while(pp<maxx)
                    {
                        pp = pp<<1;
                        pcnt++;
                        v[pp]++;
                        num[pp] += pcnt;
                    }

                }
            }
        }
        int minn = 9999999;
        for(int i=0; i<=maxx; i++)
        {

            if(v[i] == n && minn > num[i])
            {
                minn = num[i];
            }
        }
        printf("%d\n",minn);
    }
    return 0;
}




举报

相关推荐

0 条评论