题目链接
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)); }