//把所有数字两两分为一对
//那么对于一对来说
//要么两个分属不同的两堆
//要么属于同一堆
//根据这个规律搜索即可
//说是搜索,其实也是dp
#include<iostream>
#include<cmath>
#include<vector>
#include<iomanip>
#include<limits.h>
#include<algorithm>
using namespace std;
class Unite{
public:
int num_1;
int num_2;
};
int N, sum_1, sum_2, total_1, total_2;
double MIN;
vector<Unite*> list;
void DFS(int, int, int, int, int, int);
int main(){
while(true){
cin >> N;
if(N == 0) break;
list.clear();
sum_1 = sum_2 = total_1 = total_2 = 0;
for(int i = 0; i < 2 * N; i += 2){
Unite* unite = new Unite;
cin >> unite->num_1 >> unite->num_2;
list.push_back(unite);
}
MIN = INT_MAX;
DFS(0, 0, 0, 0, 0, -1);
cout << fixed << setprecision(1) << MIN << endl;
}
return 0;
}
void DFS(int total_1, int total_2, int choice, int sum_1, int sum_2, int index){
if(total_1 > N || total_2 > N || index > N) return;
int sum_1_ = 0, sum_2_ = 0;
if(choice == 1){
sum_1_ = list[index]->num_1 + list[index]->num_2;
}else if(choice == 2){
sum_2_ = list[index]->num_1 + list[index]->num_2;
}else if(choice == 3){
sum_1_ = list[index]->num_1;
sum_2_ = list[index]->num_2;
}else if(choice == 4){
sum_2_ = list[index]->num_1;
sum_1_ = list[index]->num_2;
}
if(total_1 == N && total_2 == N){
MIN = min(MIN, abs(sum_1 + sum_1_ - sum_2 - + sum_2_) / (double)N);
}
else if(total_1 != N && total_2 == N) DFS(total_1 + 2, total_2, 1, sum_1 + sum_1_, sum_2 + sum_2_, index + 1);
else if(total_1 == N && total_2 != N) DFS(total_1, total_2 + 2, 2, sum_1 + sum_1_, sum_2 + sum_2_, index + 1);
else{
DFS(total_1 + 2, total_2, 1, sum_1 + sum_1_, sum_2 + sum_2_, index + 1);
DFS(total_1, total_2 + 2, 2, sum_1 + sum_1_, sum_2 + sum_2_, index + 1);
DFS(total_1 + 1, total_2 + 1, 3, sum_1 + sum_1_, sum_2 + sum_2_, index + 1);
DFS(total_1 + 1, total_2 + 1, 4, sum_1 + sum_1_, sum_2 + sum_2_, index + 1);
}
}
//presented by 大吉大利,今晚AC