Poj Solution 2500

http://poj.org/problem?id=2500

#include <iostream>
#include <math.h>
#include <algorithm>

using namespace std;


int n,c,g;
double d,r;
const double pi = 3.1415926535898;
const double eps = 1e-8;

double area(int a, int b, int c )
{
    double l1, l2;
    l1 = sin( pi*abs(a-b)/n ) * r;
    l2 = sin( pi*abs(b-c)/n ) * r;
    return l1 * l2 * sin( pi*abs(a-c)/n ) * 2;
}

int id[1000];

void init()
{
    int k;

    cin>>d>>n>>c>>g;
    r = d *100 / 2;

    id[0] = 0;
    for( k=1; k<c; k++ )
        id[k] = ( id[k-1] + g ) % n;
    
    sort( id, id+c );
    c = unique_copy( id, id+c, id ) - id;
}

int main()
{
    int i, j, k, cas, h;
    double s, s1, s2, t1, t2;
    
    cin>>cas;
    for( h=1; h<=cas; h++ )
    {
        init();

        s = 0;
        for( i=2, j=1, k=3; i < c-1; i++ )
        {
            if( k < i+1 ) k = i+1;

            s1 = area( 0, id[j], id[i] );
            s2 = area( id[i], id[k], 0 );

            while( j+1 < i && ( t1 = area( 0, id[j+1], id[i] ) ) - s1 > -eps )
            {
                s1 = t1;
                j++;
            }

            while( k+1 < c && ( t2 = area( 0 , id[i], id[k+1] ) ) - s2 > -eps )
            {
                s2 = t2;
                k++;
            }
            if( s1 + s2 - s > -eps ) s = s1 + s2;
        }
        printf( "Scenario #%d:n%.6lfnn", h, s/10000 );
    }

    return 0;
}



											
This entry was posted in poj. Bookmark the permalink.