Cod sursa(job #2694924)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 11 ianuarie 2021 09:08:49
Problema Patrate 3 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <algorithm>
#include <stdio.h>
const float ERR = 0.00001;
struct elemente{
    float l, c;
} v[ 1000 ];
int n, patrate;

float mod( float a ){
    if( a < 0 )
        return -a;
    return a;
}

bool cmp( const elemente& A, const elemente& B ){
    if( mod( A.l - B.l ) < ERR )
        return A.c < B.c;
    return A.l < B.l;
}

bool este( elemente put ){
    int st = 0, mij;
    int dr = n - 1;
    while( st <= dr ){
        mij = ( st + dr ) >> 1;
        if( mod( put.l - v[ mij ].l ) < ERR && mod( put.c - v[ mij ].c ) < ERR )
            return true;
        if( cmp( put, v[ mij ] ) )
            dr = mij - 1;
        else st = mij + 1;
    }
    return false;
}

int main()
{
    FILE *fin = fopen( "patrate3.in", "r" );
    fscanf( fin, "%d", &n );
    for( int i = 0; i < n; i++ )
        fscanf( fin, "%f%f", &v[ i ].l, &v[ i ].c );
    fclose( fin );
    std::sort( v, v + n, cmp );
    for( int i = 0; i < n; i++ )
        printf( "%f %f\n", v[ i ].l, v[ i ].c );
    for( int i = 0; i < n; i++ )
        for( int j = i + 1; j < n; j++ ){
            elemente up, down, delta, mij;
            mij.l = ( v[ i ].l + v[ j ].l ) / ( float )2;
            mij.c = ( v[ i ].c + v[ j ].c ) / ( float )2;
            delta.l = mod( mij.l - v[ i ].l );
            delta.c = mod( mij.c - v[ i ].c );
            if( v[ i ].c < v[ j ].c ) {
                up.l = mij.l - delta.c;
                up.c = mij.c + delta.l;
                down.l = mij.l + delta.c;
                down.c = mij.c - delta.l;
            } else {
                up.l = mij.l - delta.c;
                up.c = mij.c - delta.l;
                down.l = mij.l + delta.c;
                down.c = mij.c + delta.l;
            }
            if( este( up ) && este( down ) )
                ++patrate;
        }
    FILE *fout = fopen( "patrate3.out", "w" );
    fprintf( fout, "%d\n", patrate >> 1 );
    fclose( fin );
    return 0;
}