枚举第一个点然后对剩下的点计较排序时间复杂度n2logn
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=1111;
const double eps=1e-8;
const double PI=acos(-1.0);
int sgn(double x)
{
if(fabs(x)<eps)
return 0;
if(x<0)
return -1;
else
return 1;
}
struct Point
{
double x,y;
Point(){}
Point(double _x,double _y)
{
x=_x;
y=_y;
}
Point operator -(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
double operator ^(const Point &b)const
{
return x*b.y-y*b.x;
}
double operator *(const Point &b)const
{
return x*b.x+y*b.y;
}
};
int i;
Point p[maxn];
double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
}
bool cmp(Point a,Point b)
{
int ans=sgn((a-p[0])^(b-p[0]));
if(ans==1)
return true;
else if(ans==0)
return dist(a,p[0])<dist(b,p[0]);
else
return false;
}
double num[maxn];
double num1[maxn];
bool cmp1(double a,double b)
{
return a>b;
}
int main()
{
int n;
while(1)
{
cin>>n;
if(n==-1)
break;
for(int i=0;i<n;i++)
{
cin>>p[i].x>>p[i].y;
}
int cont=0;
int cont1=0;
sort(p+1,p+n,cmp);
for(int j=2;j<n;j++)
{
num[cont++]=acos(((p[j]-p[0])*(p[j-1]-p[0]))/(dist(p[0],p[j])*dist(p[0],p[j-1])))*180.0/PI;
}
sort(num,num+cont);
num1[cont1++]=num[0];
for(i=1;i<n;i++)
{
swap(p[0],p[i]);
sort(p+1,p+n,cmp);
cont=0;
for(int j=2;j<n;j++)
{
num[cont++]=acos(((p[j]-p[0])*(p[j-1]-p[0]))/(dist(p[0],p[j])*dist(p[0],p[j-1])))*180.0/PI;
}
sort(num,num+cont);
num1[cont1++]=num[0];
}
sort(num1,num1+cont1,cmp1);
printf("%.4lf\n",num1[0]);
}
return 0;
}