(La 12.ª competencia provincial de la Copa Blue Bridge) Pregunta de prueba C Línea recta (conjunto + prevención de pérdida de precisión)

tema:

Este problema puede resolver k y b directamente de forma violenta, luego poner k y b en el conjunto como una tupla de dos, y finalmente registrar el número de elementos en el conjunto directamente, pero una cosa a tener en cuenta es que usamos punto flotante. Habrá haber pérdida de precisión en la operación, por lo que debemos tratar de evitar usar el número después de la pérdida de precisión para calcular, es decir, no podemos usar k para ingresar al cálculo cuando resolvemos b, porque habrá pérdida de precisión en el proceso de cálculo de k, por lo que debemos usar el método de sustitución de expresión de cálculo de k para calcular b

Para y1=k*x1+b y y2=k*x2+b

Sabemos que k=(y1-b)/x1, b=y2-k*x2, ya que hemos calculado k al principio, pero la k en este momento tiene una pérdida de precisión, no debemos usar la k calculada anteriormente Vuelva a sustituir en la siguiente ecuación para calcular b, pero debe usar (y1-b)/x1 en la siguiente ecuación para calcular b, es decir, b=(x1y2-y1x2)/(x1-x2), usando esta ecuación para es posible calcular b con menos pérdida de precisión

Para evitar casos especiales, se recomienda considerar el caso en que la pendiente es 0 y la pendiente no existe por separado. Esta es una buena consideración, es decir, la longitud del intervalo de x cambia + la longitud del intervalo de y cambia , que efectivamente puede evitar algunos errores, el siguiente es el código:
 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
typedef pair<double,double>PII;
int main()
{
	set<PII>p;
	for(int i=0;i<20;i++)
	for(int j=0;j<21;j++)
	for(int k=0;k<20;k++)
	for(int l=0;l<21;l++)
	{
		if(i==k||j==l) continue;
		double kk=1.0*(l-j)/(k-i);
		double b=1.0*(i*l-j*k)/(i-k);
		p.insert({kk,b});
	}
	cout<<p.size()+41;
	return 0;
}

El resultado es 40257

Supongo que te gusta

Origin blog.csdn.net/AC__dream/article/details/123958806
Recomendado
Clasificación