http://acm.pku.edu.cn/JudgeOnline/problem?id=1675
截至发贴,这道题Total Submit:1141 Accepted:332 也就是说通过率比较低,而且做的人不太多
做完了随便google了一圈,竟然没有发现和我使用同样方法的!呵呵! 最接近的是张法睿的求极角方法,不过我的比他方便且容易理解.
我的方法是:
求每对点与原点连线之间的夹角Ang;
0<=Ang<180
找出最大的Ang记为Max;若Max>=120,输出No,否则输出Yes
若原点有berry ,直接输出No.
注意:input中给出的半径值,是没有用处的
#include"stdio.h"
#include"math.h"
double Ang(int x1,int y1,int x2,int y2)
{
double a,b,c;
double pi=3.1415926535897932384626;
b=sqrt(x1*x1+y1*y1);
c=sqrt(x2*x2+y2*y2);
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return acos((b*b+c*c-a*a)/(2*b*c))/pi*180; //余弦定理,并化成角度
}
double mod(double x)
{
if(x<0)x=x+360;
if(x>=360)x=x-360;
if(x>180) x=360-x;
return x;
} //将角规范到0-180度之间
void main()
{
int T;
int r,x1,y1,x2,y2,x3,y3;
double max;
scanf("%d",&T);
while(T--)
{
scanf("%d",&r);
scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
if((x1==0&&y1==0)||(x2==0&&y2==0)||(x3==0&&y3==0)) //如果原点有berry
{
printf("Non");
goto x;
}
max=mod(Ang(x1,y1,x2,y2));
if(max<mod(Ang(x2,y2,x3,y3)))max=mod(Ang(x2,y2,x3,y3));
if(max<mod(Ang(x1,y1,x3,y3)))max=mod(Ang(x1,y1,x3,y3));
if(max>=120)printf("Yesn");
else printf("Non");
x:;
}
}