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

}

}