题目链接:点击打开链接
思路:要求黄色区域的最小角度,就是求其余白色部分的最大角度,然后用 360减它即可。而白色部分的最大角的两条边定是分别以两个相邻的点组成的。所以将所有由相邻边的构成的角排序,求出最大的角度即为白色部分的最大角度。atan2(x,y) 函数也可以求 y 为 0 时的角度,而 atan(x) 就不能了
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define PI acos(-1.0)
using namespace std;
int n;
struct node
{
double x,y,angle;
}point[100010];
bool cmp(node a,node b)
{
return a.angle<b.angle;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&point[i].x,&point[i].y);
point[i].angle=atan2(point[i].y,point[i].x);
if(point[i].angle<0)
point[i].angle+=2*PI;
}
if(n==1) // 特殊情况
{
puts("0.00000000");
continue;
}
sort(point,point+n,cmp);
double ans=point[0].angle-point[n-1].angle+2*PI; // 这个也是一个夹角
for(int i=1;i<n;i++)
{
ans=max(ans,point[i].angle-point[i-1].angle);
}
printf("%.8lf\n",(2*PI-ans)*180.0/PI);
}
return 0;
}