/*
转换二分意义: 把一个整体的最值问题转化成部分的最X最X值问题
题目本来是让找一个位置使得到该位置的时间和最小,
我们可以这样转换:
使得单个元素到该位置的最大值最小,
这样就能保证总时间和最小。
*/
#include <bits/stdc++.h>
#define setp(x) setiosflags(ios::fixed)<<setprecision(x)
using namespace std;
const int N=2e5+10;
//double x[N];
//double t[N];
double rem[N]; //存除去装扮自己的剩余的时间
int n;
struct Node
{
double x,t;
bool operator<(const Node &w)const{
return x<w.x;
}
}q[N];
bool check(double tmax) //二分最大时间 ,判断符不符合要求
{
//我们并不知道位置选在哪里,但是我们知道 单个所花最大的时间
for(int i=1;i<=n;i++)
{
rem[i]=tmax-q[i].t; //除去装扮剩余的时间
if(rem[i]<0) return false;
}
//看看往左最远到哪里,往右最远到哪里
double l=q[1].x-rem[1],r=q[1].x+rem[1];
for(int i=2;i<=n;i++)
{
l=max(l,q[i].x-rem[i]);
r=min(r,q[i].x+rem[i]);
if(l>r) return false;
}
//l,r其实就是tmax要定位位置x0所在的范围
//类似于夹逼法,l往大取,r往小取
return true;
}
double trans(double tmax)
{
for(int i=1;i<=n;i++)
{
rem[i]=tmax-q[i].t; //除去装扮剩余的时间
}
double l=q[1].x-rem[1],r=q[1].x+rem[1];
for(int i=2;i<=n;i++)
{
l=max(l,q[i].x-rem[i]);
r=min(r,q[i].x+rem[i]);
}
//返回夹逼出来的 l
return l;
}
int main()
{
int T;
cin>>T;
while(T--)
{
//int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>q[i].x;
}
for(int i=1;i<=n;i++)
{
cin>>q[i].t;
}
sort(q+1,q+1+n);
double l=0,r=1e9;
while(r-l>1e-6)
{
double mid=(l+r)/2.0;
if(check(mid)) r=mid;
else l=mid;
}
//cout<<"l is "<<l<<endl;
double tm=trans(l); //把最达大时间精准定位到位置
cout << tm << '\n';
// cout<<tm<<endl;
}
return 0;
}