#include <iostream>
#include <queue>
#include <cassert>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF (1<<30)
class AC_Solution{
public:
struct NODE{
int x,cost;
NODE(int x,int cost) : x(x) , cost(cost) {}
bool operator < (const NODE &a) const{
return cost > a.cost;
}
};
int getDistance(int a,int b){
return abs(a-b) == 1 ? 2 : (abs(a-b)+2) / 3;
}
int getCost(int a,int b){
priority_queue<NODE> Q;
Q.push(NODE(b,0));
map<int,bool> used;
while(Q.size()){
NODE q = Q.top(); Q.pop();
assert(q.x >= 0);
if(used[q.x])continue;
else used[q.x] = true;
if(q.x==a) return q.cost;
int sq = sqrt(q.x);
if(sq != 0)Q.push( NODE( (sq-1) , q.cost + 1 + getDistance(q.x,(sq-1)*(sq-1)) ) );
Q.push( NODE( sq , q.cost + 1 + getDistance(q.x,sq*sq) ) );
Q.push( NODE( (sq+1) , q.cost + 1 + getDistance(q.x,(sq+1)*(sq+1)) ) );
Q.push( NODE( a , q.cost + getDistance(q.x , a) ) );
}
assert(0);
return -1;
}
int solve(vector<int> fav){
static int dp[1<<11][11];
int graph[11][11]={} , N = fav.size();
for(int i = 0 ; i < (1<<N) ; i++)
for(int j = 0 ; j < N ; j++)
dp[i][j] = INF;
for(int i = 0 ; i < N ; i++){
for(int j = 0 ; j < N ; j++){
graph[i][j] = getCost(fav[i],fav[j]);
}
}
for(int i = 0 ; i < N ; i++) dp[1<<i][i] = 0;
for(int i = 0 ; i < (1<<N) ; i++)
for(int j = 0 ; j < N ; j++)
for(int k = 0 ; k < N ; k++)
dp[i|(1<<k)][k] = min(dp[i|(1<<k)][k],dp[i][j]+graph[j][k]);
int ans = INF;
for(int i = 0 ; i < N ; i++) ans = min( ans , dp[(1<<N)-1][i] );
return ans;
}
};
int main(){
int n;
cin >> n;
vector<int> fav;
for(int i = 0 ; i < n ; i++){int t; cin >> t; fav.push_back(t); }
cout << AC_Solution().solve(fav) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjYXNzZXJ0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIElORiAoMTw8MzApCgpjbGFzcyBBQ19Tb2x1dGlvbnsKcHVibGljOgoJc3RydWN0IE5PREV7CgkJaW50IHgsY29zdDsKCQlOT0RFKGludCB4LGludCBjb3N0KSA6IHgoeCkgLCBjb3N0KGNvc3QpIHt9CgkJYm9vbCBvcGVyYXRvciA8IChjb25zdCBOT0RFICZhKSBjb25zdHsKCQkJcmV0dXJuIGNvc3QgPiBhLmNvc3Q7CgkJfQoJfTsKCWludCBnZXREaXN0YW5jZShpbnQgYSxpbnQgYil7CgkJcmV0dXJuIGFicyhhLWIpID09IDEgPyAyIDogKGFicyhhLWIpKzIpIC8gMzsgCgl9CgoJaW50IGdldENvc3QoaW50IGEsaW50IGIpewoJCXByaW9yaXR5X3F1ZXVlPE5PREU+IFE7CgkJUS5wdXNoKE5PREUoYiwwKSk7CgkJbWFwPGludCxib29sPiB1c2VkOwoJCXdoaWxlKFEuc2l6ZSgpKXsKCQkJTk9ERSBxID0gUS50b3AoKTsgUS5wb3AoKTsKCQkJYXNzZXJ0KHEueCA+PSAwKTsKCQkJaWYodXNlZFtxLnhdKWNvbnRpbnVlOwoJCQllbHNlIHVzZWRbcS54XSA9IHRydWU7CgkJCWlmKHEueD09YSkgcmV0dXJuIHEuY29zdDsKCQkJaW50IHNxID0gc3FydChxLngpOwoJCQlpZihzcSAhPSAwKVEucHVzaCggTk9ERSggKHNxLTEpICwgcS5jb3N0ICsgMSArIGdldERpc3RhbmNlKHEueCwoc3EtMSkqKHNxLTEpKSApICk7CgkJCVEucHVzaCggTk9ERSggc3EgLCBxLmNvc3QgKyAxICsgZ2V0RGlzdGFuY2UocS54LHNxKnNxKSApICk7CgkJCVEucHVzaCggTk9ERSggKHNxKzEpICwgcS5jb3N0ICsgMSArIGdldERpc3RhbmNlKHEueCwoc3ErMSkqKHNxKzEpKSApICk7CgkJCVEucHVzaCggTk9ERSggYSAsIHEuY29zdCArIGdldERpc3RhbmNlKHEueCAsIGEpICkgKTsKCQl9CgkJYXNzZXJ0KDApOwoJCXJldHVybiAtMTsKCX0KCglpbnQgc29sdmUodmVjdG9yPGludD4gZmF2KXsKCQlzdGF0aWMgaW50IGRwWzE8PDExXVsxMV07CgkJaW50IGdyYXBoWzExXVsxMV09e30gLCBOID0gZmF2LnNpemUoKTsKCQlmb3IoaW50IGkgPSAwIDsgaSA8ICgxPDxOKSA7IGkrKykKCQkJZm9yKGludCBqID0gMCA7IGogPCBOIDsgaisrKQoJCQkJZHBbaV1bal0gPSBJTkY7CgkJCgkJZm9yKGludCBpID0gMCA7IGkgPCBOIDsgaSsrKXsKCQkJZm9yKGludCBqID0gMCA7IGogPCBOIDsgaisrKXsKCQkJCWdyYXBoW2ldW2pdID0gZ2V0Q29zdChmYXZbaV0sZmF2W2pdKTsKCQkJfQoJCX0KCQlmb3IoaW50IGkgPSAwIDsgaSA8IE4gOyBpKyspIGRwWzE8PGldW2ldID0gMDsKCQkKCQlmb3IoaW50IGkgPSAwIDsgaSA8ICgxPDxOKSA7IGkrKykKCQkJZm9yKGludCBqID0gMCA7IGogPCBOIDsgaisrKQoJCQkJZm9yKGludCBrID0gMCA7IGsgPCBOIDsgaysrKQoJCQkJCWRwW2l8KDE8PGspXVtrXSA9IG1pbihkcFtpfCgxPDxrKV1ba10sZHBbaV1bal0rZ3JhcGhbal1ba10pOwoJCWludCBhbnMgPSBJTkY7CgkJZm9yKGludCBpID0gMCA7IGkgPCBOIDsgaSsrKSBhbnMgPSBtaW4oIGFucyAsIGRwWygxPDxOKS0xXVtpXSApOwoJCXJldHVybiBhbnM7Cgl9Cn07CgppbnQgbWFpbigpewoJaW50IG47CgljaW4gPj4gbjsKCXZlY3RvcjxpbnQ+IGZhdjsKCWZvcihpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyl7aW50IHQ7IGNpbiA+PiB0OyBmYXYucHVzaF9iYWNrKHQpOyB9Cgljb3V0IDw8IEFDX1NvbHV0aW9uKCkuc29sdmUoZmF2KSA8PCBlbmRsOwoJCn0=