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;
} 
 









