Hoj 11619

Hoj 11619
#include  < stdio.h >
#include 
< math.h >

struct  point
{
    
double  x, y;
};

int  n;
point p[
95 ], up[ 95 ], down[ 95 ];
int    l_up, l_down;
double  area_up, area_down, upx, downx;

inline 
double  area(point  * po,  int  len)
{
    
double  sum  =   0 ;
    
for ( int  i  =   0 ; i  <  len; i  ++ )
        sum 
+=  po[i].x  *  po[i  +   1 ].y  -  po[i].y  *  po[i  +   1 ].x;
    
return  sum  /   2 ;
}

inline 
double  centroid(point  * po,  int  len)
{
    
double  sum  =   0 ;
    
for ( int  i  =   0 ; i  <  len; i  ++ )
        sum 
+=  (po[i].x  +  po[i  +   1 ].x)  *  (po[i].x  *  po[i  +   1 ].y  -  po[i].y  *  po[i  +   1 ].x);
    
return  sum;
}

int  main()
{
    
double  x1, x2, y1, y2, x;
    
while (scanf( " %d " & n)  !=  EOF)
    {
        
int  i;
        
for (i  =   0 ; i  <  n; i  ++ )
            scanf(
" %lf %lf " & p[i].x,  & p[i].y);
        p[n] 
=  p[ 0 ];
        l_up 
=   0 ;
        l_down 
=   0 ;
        
for (i  =   0 ; i  <  n; i  ++ )
        {
            
if (p[i].y  >=   0 )    up[l_up ++ =  p[i];
            
if (p[i].y  <=   0 )    down[l_down ++ =  p[i];
            
if (p[i].y  *  p[i  +   1 ].y  <   0 )
            {
                x1 
=  p[i].x;
                x2 
=  p[i  +   1 ].x;
                y1 
=  p[i].y;
                y2 
=  p[i  +   1 ].y;
                x 
=  x1  +  (x2  -  x1)  *  y1  /  (y1  -  y2);
                point tp;
                tp.x 
=  x; tp.y  =   0 ;
                up[l_up
++ =  tp;
                down[l_down
++ =  tp;
            }
        }
        up[l_up] 
=  up[ 0 ];
        down[l_down] 
=  down[ 0 ];
        
        area_up 
=  area(up, l_up);
        area_down 
=  area(down, l_down);
        upx 
=  centroid(up, l_up);
        downx 
=  centroid(down, l_down);
        
double  cx_up  =  upx / ( 6   *  area_up), cx_down  =  downx / ( 6   *  area_down);
        
if ( fabs(cx_up  -  cx_down)  <  1e - 8 )
            puts(
" Balanced. " );
        
else   if (cx_up  >  cx_down)
            printf(
" CE is forward of CLR by %.2lf units.\n " ,cx_up  -  cx_down);
        
else
            printf(
" CE is aft of CLR by %.2lf units.\n " ,cx_down  -  cx_up);    
    }
}

你可能感兴趣的:(Hoj 11619)