题目链接

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));

}