#include <iostream>
#include <vector>
#include <cstring>
//#include <bits/stdc++.h>
using namespace std;
 vector<pair<int, int>>graph[2000];
 int dp[2002][4100];
 int n;
 int dinamicko(int i, int prev_number){
 if(i==n){
    return 0;
 }
 if(dp[i][prev_number]!=-1){
    return dp[i][prev_number];
 }
int result = 2e9;

 for(int j=0; j<graph[i].size(); j++){
     if(prev_number <= graph[i][j].first) {
         
         result=min(result, dinamicko(i+1, graph[i][j].first) + graph[i][j].second);
             
         
     }
 }
 return dp[i][prev_number]=result;
 }

int main()
{


    cin>>n;
    for(int i=0; i<n; i++){
        int a;
        cin>>a;
        for(int bitmask=0; bitmask<(1<<12); bitmask++){
            if(__builtin_popcount(bitmask)== __builtin_popcount(a)){
            graph[i].push_back(make_pair(bitmask, (__builtin_popcount(a^bitmask))/2));
            }
        }
    }
    memset(dp, -1, sizeof dp);
    
    cout<<dinamicko(0, 0) << endl;
    return 0;
}
