题目大意:给你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弧度————搜狗百科
玩家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;
}