jueves, 22 de diciembre de 2011

Problema C: Validador de Entrada UNMSM-FISI 2011

Concurso de Programación UNMSM-FISI 2011

Problema C: Validador de Entrada

Descargar problema: UNMSM-FISI 2011 Problema C

public class ProblemaC
{
    // Indica si se termino de leer la linea
    static boolean termino;

    public static void main( String args[] ) throws Exception
    {
        int numCasos[]; // Numero de casos que se analizaran
        int a[], b[];   // Limite inferior y superior del intervalo
        int[] valoresA; // Almacena los prefijos de 1, 2, ... digitos de a
        int[] valoresB; // Almacena los prefijos de 1, 2, ... digitos de b
        int[] numero;   // Numero que se analizara
        int pos;
        long temp;
 
        numCasos = leer();

        for( int i = 0; i < numCasos[ 0 ]; i ++ )
        {
            termino = false;

            a = leer();
            b = leer();

            // Creamos los prefijos de 1, 2, ... digitos de a y b
            valoresA = new int[ a[1] ];
            valoresB = new int[ a[1] ];
   
            // Hacemos una copia de los valores de a y b
            int copiaA = a[ 0 ], copiaB = b[ 0 ];
 
            for( int j = valoresA.length - 1; j >= 0; j -- )
            {
                // Guardamos los prefijos
                valoresA[ j ] = copiaA;
                valoresB[ j ] = copiaB;

                // Generamos los siguientes prefijos
                copiaA /= 10;
                copiaB /= 10;
            } 

            System.out.print( "Caso #" + (i+1) + ":" );

            // Leemos los numeros a comparar
            while( !termino )
            {
                numero = leer();
                temp = 10l * numero[ 0 ];
    
                if( numero[ 1 ] >= a[ 1 ] )
                    pos = a[ 1 ] - 1;
                else
                    pos = numero[ 1 ] - 1;
                
                // Si el numero leido es mayor que el limite inferior, debera 
                // estar dentro de los valores del intervalo
                if( numero[ 0 ] >= valoresA[ pos ] )
                {
                    if( numero[ 0 ] <= valoresB[ pos ] )
                        System.out.print( " 1" );
                    else
                        System.out.print( " 0" );
                } 
   
                // Si el numero leido es menor que el limite inferior, el mismo
                // numero multiplicado por 10 debera estar dentro del intervalo
                else if( temp  >= valoresA[ pos ] && temp <= valoresB[ pos ] )
                    System.out.print( " 1" );
                else
                    System.out.print( " 0" ); 
            }
   
            System.out.println();
        } 
    }
    
    // Retorna el siguiente numero de la entrada, ademas de su longitud
    public static int[] leer() throws Exception
    {
        int[] numero = new int[ 2 ];
        int car = System.in.read();
  
        while( car > 47 && car < 58 )
        {
            numero[ 0 ] = 10 * numero[ 0 ] + car - 48;
            numero[ 1 ] ++;

            car = System.in.read();
        }
  
        // Si se encontro el fin de linea, indicamos que se termino la linea
        if( car == '\n' )
            termino = true;

        // Si encontramos una coma nos saltamos el espacio en blanco
        else if( car == ',' )
            System.in.read();
  
        return numero;
    }
}

No hay comentarios:

Publicar un comentario