L3-021 Altar (30 puntos) (teoría gráfica)

L3-021 Altar (30 puntos)
En la antigua ciudad de Mindray, hay n pedazos de piedra sagrada erguidos majestuosamente . Los ancianos discutieron y seleccionaron 3 piedras divinas para formar un altar. Debido a que la intensidad de energía del altar es inversamente proporcional a su área, cuanto menor sea el área del altar, mejor. En particular, si dos piedras sagradas tienen las mismas coordenadas, o tres piedras sagradas están alineadas, el área del altar es 0.000.
Los ancianos descubrieron que este problema no es tan simple, por lo que le encomiendan que programe para resolver este problema.
Formato de entrada:
introduzca un número entero positivo n (3 ≤ n ≤ 5000) en la primera línea. En las siguientes n filas, cada fila tiene dos números enteros, que representan la abscisa y la ordenada de la piedra divina (−10 9 ≤ abscisa, ordenada <109).

Formato de
salida : envíe el área mínima del altar en una línea, redondeada a 3 decimales.

Muestra de entrada:
8
3 4
2 4
1 1
4 1
0 3
3 0
1 3
4 2
Muestra de salida:
0.500
Explicación de la muestra El
valor de salida es igual al área del triángulo rojo o púrpura en la figura.

altar.JPG

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
    
    
	ll x,y;
	int rel;
}a[5010],b[5010];
int cmp(node x,node y)//极角排序 
{
    
    
	if(x.rel!=y.rel) return x.rel<y.rel;
	return x.x*y.y-x.y*y.x<0; 
}
int judge(node x)//返回象限 
{
    
    
	if(x.x>0&&x.y>0) return 1;
	if(x.x>0&&x.y<0) return 2;
	if(x.x<0&&x.y<0) return 3;
	if(x.x>0&&x.y>0) return 4;	
}
int n,cnt;
double ans=-1;
int main()
{
    
    
 ios::sync_with_stdio(false);
 cin>>n;
 for(int i=1;i<=n;i++)
  cin>>a[i].x>>a[i].y;
 for(int i=1;i<=n;i++)
 {
    
    
 	cnt=1;
 	for(int j=1;j<=n;j++)
 	{
    
    
 	 if(i==j) continue;
     b[cnt].x=a[j].x-a[i].x;
     b[cnt].y=a[j].y-a[i].y;
     b[cnt].rel=judge(b[cnt]);
     cnt++;
	}
	sort(b+1,b+n,cmp);
	for(int j=1;j<n-1;j++)
	 if(ans==-1||fabs(b[j+1].x*b[j].y-b[j+1].y*b[j].x)*0.5<ans)
		ans=fabs(b[j+1].x*b[j].y-b[j+1].y*b[j].x)*0.5;
 }
 cout<<fixed<<setprecision(3)<<ans;
 return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43540515/article/details/113028592
Recomendado
Clasificación