ACM PKU 1675 Happy Birthday!

ACM PKU 1675 Happy Birthday!

 
 
 

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

 }


}

你可能感兴趣的:(ACM PKU 1675 Happy Birthday!)