https://ac.nowcoder.com/acm/contest/3006/B
título Descripción
Debido a que el clan de res coincide a menudo lejos, por lo que una gran parte del país para establecer las bases de entrenamiento, cada base tiene una coordenada .
Este fin de semana, el equipo de Tauro tiene que salir del partido, punto de partido en cada juego de eje. equipo de Tauro para la comodidad del juego, en busca de una base de entrenamiento para alcanzar las máximas y mínimas distancias como un lugar para la carrera.
El problema para el equipo Taurus demasiado simple, que depende de usted, usted lo ayude a contar ~
pensamiento
Escrito en la solución a un problema es un tercio, dos puntos también pueden escribir, yo estaba medio escrito, dijo que el siguiente es un pensamiento dicotómico.
La mitad de la distancia máxima más pequeña, el primer lugar en un determinado eje, para cada base de entrenamiento, si la distancia es el mismo lugar , el lugar debe estar en él para que el centro de un radio de círculo, que es redonda y eje dos intersecciones, dos minutos o menos cuando la distancia es la legal, es decir, siempre que el espacio entre dos coordenadas válidos. Este registro se puede considerar el espacio de coordenadas, nos preguntamos por más base de entrenamiento de esta intersección rango de coordenadas, si la intersección no está vacía, entonces la legítima, si esto representa la intersección está vacía no es factible. Debido a la demanda de la necesidad de la raíz cuadrada, y el juicio de valor especial por lo tanto necesitan sobre el número de la raíz es positiva, no positiva directa ilegal.
/*************************************************************************
> File Name: B.cpp
> Author: amoscykl
> Mail: [email protected]
> Created Time: 2020年02月13日 星期四 14时52分21秒
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int px[N], py[N];
int n;
#define eps 1e-8
bool check(double x){
double xl, xr;
double temp = x * x - py[1] * py[1] * 1.0;
if (temp < 0)return false;
temp = sqrt(temp);
xl = px[1] * 1.0 - temp;
xr = px[1] * 1.0 + temp;
for (int i = 2; i <= n; i++){
temp = x * x - py[i] * py[i] * 1.0;
if (temp < 0)return false;
temp = sqrt(temp);
double txl = px[i] * 1.0 - temp;
double txr = px[i] * 1.0 + temp;
if (xl > txr || xr < txl){
// 没有交集
return false;
}
else{
xl = max(xl, txl);
xr = min(xr, txr);
}
}
return true;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d %d", px + i, py + i);
}
double l = 0.0;
double r = inf * 1.0;
double res = -1;
while (r - l > eps){
double mid = (l + r) / 2.0;
if (check(mid)){
res = mid;
r = mid;
}
else l = mid;
}
printf("%.6lf\n", res);
return 0;
}