hdu 3532 Max Angle

题目大意:给你n个点,玩家1挑选一点A,玩家2挑选两点B、C,玩家1想使∠BAC最大,
玩家2想使∠BAC最小,玩家2足够聪明,求玩家1能使∠BAC达到的最大角度
 3 <= n <= 1001
注释:玩家2足够聪明,所以他可以选出每个A对应的使∠BAC最小的B、C组合
方法:
1:枚举点A,然后找到与之对应的玩家2想要的点B、C的组合;
2:将这些ABC组合还有与之对应的∠BAC记录下来;
2:遍寻所有∠BAC,找到玩家1所想要的最大的那一组,其角度就是答案了;
知识点:第一步的时候用atan2直接算其余n-1个点与A点连线的斜率
atan2:
返回给定的 X 及 Y 坐标值的反正切值。反正切的角度值等于 X 轴正方向与
通过原点和给定坐标点 (Y,X) 的射线之间的夹角。结果以弧度表示并介于 -pi 到 
pi 之间(不包括 -pi)————搜狗百科
弧度:
根据定义,一周的弧度数为2πr/r=2π,360°角=2π弧度,因此,1弧度约为57.3°,即
57°17'44.806'',1°为π/180弧度,近似值为0.01745弧度————搜狗百科

#include <iostream>
#include <cmath>
#include <cstdio>
#include<algorithm>
using namespace std;
struct point
{
    double x,y;
    double c;
}p[1005],ps[1005];
double pi=acos(-1);
int main()
{
    int n,k;
    double data[1005];
    double minc,maxc,tmp;
    while(cin>>n&&n>0)
    {
        for(int i=0;i<n;i++)
        cin>>p[i].x>>p[i].y;
        for(int i=0;i<n;i++)
        {k=0;
        for(int j=0;j<n;j++)
        {
            if(i==j)
             continue;
           double xx=p[j].x-p[i].x;
            double yy=p[j].y-p[i].y;
            double a=atan2(yy,xx)*180/pi;
            //p[i]p[j]射线与x轴夹角
            if(a<0)
            a=a+360;
            data[k]=a;
            k++;
         }
         sort(data,data+k);
         minc=999;
            for(int i=1;i<k;i++)
            {
                double x=data[i]-data[i-1];
                minc=min(minc,x);
            }
         tmp=360-data[k-1]+data[0];
         minc=min(tmp,minc);
         p[i].c=minc;
         //存下每个A对应的∠BAC
         //printf("%.2f\n",p[i].c);调试
        }
        maxc=-999;
        for(int i=0;i<n;i++)
         maxc=max(maxc,p[i].c);
         //选出A想要的
        printf("%.4f\n",maxc);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_38144740/article/details/79326763