题目链接
https://codeforces.com/problemset/problem/257/C
解题思路
统计每两个相邻(抽象相邻)点之间的夹角,找到最大的夹角,用360-最大夹角就是答案。
难在用asin求角,转化为0~360内的角度值。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
const double esp=1e-8;
const double PI=3.14159265358979323846264338327950288419716939937510;
struct angle
{
double x,y,ang;
};
int n;
angle a[N];
bool cmp(angle a,angle b)
{
return a.ang<b.ang;
}
set<double,greater<double> > aaa;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
double tmp=asin(a[i].y/sqrt(a[i].x*a[i].x+a[i].y*a[i].y))*180.0/PI;
a[i].ang=tmp;
if(abs(tmp)<=esp)
{
if(a[i].x<0) a[i].ang=180;
}
else if(abs(tmp+90)<=esp)
{
if(a[i].y<0) a[i].ang=270;
}
else
{
if(a[i].x<0 && a[i].y>0)//2
{
a[i].ang=180-tmp;
}
else if(a[i].x<0 && a[i].y<0)//3
{
a[i].ang=180-tmp;
}
else if(a[i].x>0 && a[i].y<0)//4
{
a[i].ang=360+tmp;
}
}
}
// for(int i=1;i<=n;i++) cout<<a[i].ang<<endl;
// cout<<endl;
sort(a+1,a+n+1,cmp);
// for(int i=1;i<=n;i++)
// cout<<a[i].ang<<endl;
// cout<<endl;
for(int i=2;i<=n;i++)
aaa.insert(a[i].ang-a[i-1].ang);
aaa.insert(a[1].ang+360.0-a[n].ang);
set<double>::iterator it=aaa.begin();
printf("%.10lf\n",360.0-(*it));
}
京公网安备 11010502036488号