HDU 6798 Triangle Collision (dos puntos + geometría)

El significado de la pregunta: Hay una pequeña bola en un triángulo equilátero con un lado de longitud L. Dada la posición inicial y la velocidad, encuentre la k-ésima colisión con el lado.

Solución: dicotomía + geometría
Copie el triángulo en la siguiente figura y considere cuántos lados pasan por cada reflejo de un punto.
Inserte la descripción de la imagen aquí
Para el lado inferior del triángulo, es el eje x, que se puede obtener directamente.
Para los lados izquierdo y derecho del triángulo, necesitamos rotar, es decir, obtener las coordenadas y la velocidad del punto cuando los lados izquierdo y derecho son el eje x.

eps se puede cambiar a 1e-6.

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
int t;
double l, x, y, vx, vy, k;
double h;
double solve(double y, double vy, double t) {
    
    
	return abs(floor((y + vy * t) / h));
}
bool check(double mid) {
    
    
	double res = solve(y, vy, mid) +
		solve(fabs((y + sqrt(3) * x - h) / 2), (-sqrt(3) * vx - vy) / 2, mid) +
		solve(fabs((-y + sqrt(3) * x + h) / 2), (vx * sqrt(3) - vy) / 2, mid);
	return res >= k;
}
int main() {
    
    
	scanf("%d", &t);
	while (t--) {
    
    
		scanf("%lf%lf%lf%lf%lf%lf", &l, &x, &y, &vx, &vy, &k);
        h = l * sqrt(3) / 2;
		double l = 0, r = 1e11, mid;
		while (r - l > eps) {
    
    
			mid = (l + r) / 2;
			if (check(mid))
				r = mid;
			else
				l = mid;
		}
        printf("%.8f\n", mid);
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43680965/article/details/107647739
Recomendado
Clasificación