Niu Ke Algoritmo de vacaciones de invierno Campo de entrenamiento básico 5 El lugar de entrenamiento del equipo Niu Niu (tres puntos)

Tema: https://ac.nowcoder.com/acm/contest/3006/B
Solución de problemas de referencia: https://ac.nowcoder.com/acm/problem/blogs/201956
Blog de referencia de métodos de tres secciones : https: / / blog .csdn.net / beiyouyu / article / details / 7875480? depth_1-utm_source = distribuir.pc_relevant.none-task & utm_source = distribuir.pc_relevant.none-task

El método para esta pregunta es
dividir la respuesta en tres puntos. A continuación, hablemos en detalle sobre la regla de los tercios. Todos sabemos que dos puntos pueden encontrar un cierto valor en una función monótona.
La regla de los tercios se usa principalmente para resolver el problema de encontrar el valor extremo de la función unimodal , y para este tema, analizamos el rango y podemos concluir aproximadamente que a medida que x aumenta, la distancia máxima primero aumenta y luego disminuye.
Entonces, el método específico de tres puntas es que tenemos que dividir en dos mitades y luego dividir uno de los cambios en dos mitades. La forma general es 2: 1: 1. Aquí, usamos m para significar la mitad y mm para significar la mitad de la mitad. Para solicitar el valor mínimo, solo necesita mover el límite hacia el lado más grande cada vez.
Luego hay otra pregunta, ¿cuántas veces debe hacer un bucle para encontrar la respuesta? ¿Cómo expresarlo?

Hay dos formas: 1. Utilice el bucle for directamente durante un cierto número de veces.
Se usa 100 veces aquí. Porque cada vez que se repite el ciclo, el intervalo restante se vuelve a dividir en tres puntos, que es una disminución de la potencia negativa de 2. Por lo tanto, el valor de 2 elevado a la centésima potencia multiplicado por la longitud del intervalo debería ser lo suficientemente preciso.
2.
Mientras que el bucle while (l + EPS <r)
donde EPS es un número infinitamente pequeño, esto se comprende bien, así que no diré más.
el código se muestra a continuación:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f;
const int N=100005;
using namespace std;
typedef long long ll;
struct node{
    
    
    int x,y;
}a[N];
int n;
double maxn;
double check(double c){
    
    
    maxn=0.0;
    for(int i=1;i<=n;i++){
    
    
        double sum=a[i].y*a[i].y+(a[i].x-c)*(a[i].x-c);
        maxn=max(maxn,sum);
    }
    return maxn;
}

void slove(double l,double r){
    
    
    for(int i=1;i<=100;i++){
    
    
        double m=l+(r-l)/2;
        double mm=l+(m-l)/2;
        if(check(mm)>check(m))
            l=mm;
        else
            r=m;
    }
}
int main ()
{
    
    
    //freopen("D:\\input.txt", "r", stdin);
    //freopen("D:\\output.txt", "w", stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d %d",&a[i].x,&a[i].y);
    slove(-10000,10000);
    double ans=sqrt(maxn);
    cout<<ans<<endl;
	return 0;
}


Supongo que te gusta

Origin blog.csdn.net/u011612364/article/details/104758220
Recomendado
Clasificación