题目链接:http://codeforces.com/problemset/problem/780/B
题意:有n个人,每个人位于xi,每个人的速度为vi,现让你选择一个点使得他们用最小的时间集合,输出最小的时间
解析:二分选择的那个点即可
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int maxn = 1e6+100;
struct node
{
int x;
int v;
bool operator < (const node &b)const
{
return x<b.x;
}
}a[maxn];
double f(double mid,int n)
{
double res = 0;
for(int i=0;i<n;i++)
{
double tmp = 1.0*fabs(a[i].x-mid)/(1.0*a[i].v);
res = max(tmp,res);
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i].x);
for(int i=0;i<n;i++)
scanf("%d",&a[i].v);
sort(a,a+n);
int k = 200;
double l = 0,r = 1e9+10;
while(k--)
{
double mid = (l+r)/2.0;
double midmid = (mid+r)/2.0;
//printf("mid: %.2f\tmidmid: %.2f\n",f(mid,n),f(midmid,n));
if(f(mid,n)>f(midmid,n))
l = mid;
else
r = midmid;
}
printf("%.6f\n",f(l,n));
return 0;
}