#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <utility>
#include <functional>
#include <queue>
#include <cmath>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/numeric.hpp>
#include <boost/multi_array.hpp>
#include <boost/math/common_factor_ct.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/pending/disjoint_sets.hpp>
#include <boost/icl/interval_map.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/strong_components.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/bellman_ford_shortest_paths.hpp>
#include <boost/graph/kruskal_min_spanning_tree.hpp>
#include <boost/graph/graph_utility.hpp>
#include <iomanip>      // std::setprecision

#define REP(i, N) for(int i=0; i<(N); i++)
using namespace std;
using namespace boost::math;

int main() {
	int N;

	cin >> N;
    multiset<double> v;
    double r = 0.0;
  
    REP(i, N) {
      int j;
      cin >> j;
      v.insert(j);
    }
  
    REP(i, N-1) {
      auto ms = 10000000.0;
      auto it = v.begin(), mit = ++v.begin();
      
      for (;;) {
        int now = *it++;
        
        if (it == v.end())
          break;
        now = *it - now;
        
        if (ms > now) {
          mit = it;
          ms = now;
        }
      }
      
      auto nv = (*mit + *(--mit)) / 2.0;
      v.erase(mit++);
      v.erase(mit);
      v.insert(nv);
    }

	cout << std::setprecision(9) << *v.begin() << endl;

	return 0;
}
