simetría Problema eje 5_6 uva1595

No puedo hablar de un plato ...
Este problema wa una noche, asustado, y me fue engañado título, digamos buena gama de x es -10.000 a 10.000 hacer
yo violencia enumerar el eje X de simetría de la limpieza ... una noche, y al día siguiente, probar un poco bajo el alcance de x (escribir un ciclo de muerte) - y bastante seguro, T ... una
realmente tiene sentido decir
que el problema simétrica para coger su palabra, entonces es fácil pensar que el eje de simetría es la más a la izquierda X y X de la mitad de la extrema derecha,
y ya que esto puede causar aparece un error de coma flotante de punto flotante, entonces podemos al mismo tiempo, para todo x * 2 bien, eliminar la coma flotante
seguido por el tiempo que un juez de la primera a la última , si existe simetría con respecto al eje de simetría del punto se puede
determinar si es el punto de mapa de apertura <par, int> amigos en OK (violencia directa encontrar también, porque poco n)
en Código

#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6; 
typedef pair<int,int> point;
vector <point> dian;
int main()
{
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
		dian.clear();  //注意清空 
		map <point,int> you; // 因为懒得写map 的清空,直接开里面 
		int ok  = 1,z = 0,xl,xr,mid; // xl,xr最左和最右 mid 对称轴 
		scanf("%d",&n);
		for (int i = 0; i < n; i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			x*=2;
			if(!i) 
			{
				xl = x;  xr = x;
			}
			if(x > xr) xr =x;
			if(x < xl) xl = x;
			point a = make_pair(x,y);
			dian.push_back(a);
			you[a] = 1;  //有这个点 
		}  
		mid = (xr+xl)/2;
			point w;
			for (int j = 0; j < n; j++)
			{
				
				int dis =  mid - dian[j].first;
				int k = mid + dis; //对称点的横坐标的计算 
				w = make_pair( k , dian[j].second);
				if(!you[w]) 
				{
					ok = 0; break;
				}
			}
		if(ok) printf("YES\n");
		else   printf("NO\n");
	}
	return 0;
}

Otra forma consiste en determinar el eje de simetría, siempre y cuando a continuación, puede ordenar la derecha (este necesidades de clasificación para encontrar la ley, como se detalla en el código), entonces la izquierda a la derecha del punto, si el eje de la derecha simetría, y el mismo eje vertical, es sin duda MO tener problemas, pero tiene que considerar un ejemplo de ello es el eje de simetría, el eje vertical no es lo mismo Mo fue también el problema, si cada punto de ok ok
código de abajo

#include <bits/stdc++.h>
using namespace std;
struct stu{
	int x,y;
}q[2000]; 
int comp(stu a, stu b)
{
	if(a.x == b.x) return a.y > b.y;
	return a.x < b.x;
}  //对称轴左边 按x从小到大 然后 x同时 y 先大后小 
int comp2(stu a, stu b)
{
	if(a.x == b.x) return a.y < b.y;
	return a.x < b.x;
} //对称轴右边同理 但 y 先小后大 可打出配合 
int main()
{
	int t,n,z,z1;
	cin>>t;
	while(t--)
	{
		cin>>n;
		for (int i = 0 ; i < n; i++)
		{
			scanf("%d%d",&q[i].x,&q[i].y);	q[i].x *= 2; 
		} 
		sort(q,q+n,comp);
		if(n>=4)  
		{
			int k = (n/2) + (n%2); //找规律 正确的排序 
			sort(q+k,q+n,comp2); 
		}		
		int ok = 1; //是否ok 
		int mid = 0;
		for (int i = 0; i < n/2; i++)
		{
			if(!i) 	mid = ( q[i].x + q[n-1-i].x ) /2;
			else if( mid != ( q[i].x + q[n-1-i].x )/2 )
			{
				ok = 0; break;
			} // 对称轴不行 
			if(q[i].y != q[n-1-i].y &&  (q[i].x != mid || q[n-1-i].x != mid))
			{
				ok = 0; break;
			} // 纵坐标不行 
		}
		if(ok) printf("YES\n");
		else   printf("NO\n"); 
	}
	return 0;
}

Publicado 55 artículos originales · ganado elogios 1 · vistas 2656

Supongo que te gusta

Origin blog.csdn.net/qq_37548017/article/details/100097336
Recomendado
Clasificación