some image

Tag Maratones Programacion

Solucionando : Small Factorials

Etiquetas: , Blog, Challenges No comments

Este ejercicio pertenece a la categoría easy de codechef y aunque realmente no tiene un grado de complejidad elevado, el punto clave es que tan rápido puede arrojar los resultados obteniendo el factorial de un 1 <= n <= 100.  Bien aqui está el planteamiento de mi solución utilizando la clase BigInteger y un pequeño ciclo for.

 

import java.math.BigInteger;
import java.util.Scanner;
class SmallFactorial {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		//Lines to processs
		int lines = sc.nextInt();
		for(int i = 0;  i < lines; i++){
			int n = sc.nextInt();
			BigInteger fac = BigInteger.ONE;
			//Get the Factorial
			for (int j = 1; j <= n; j++) {
				fac = fac.multiply(BigInteger.valueOf(j));
			}
			System.out.println(fac);
		}
	}
}

Salu2

Solucionando : Odd

Etiquetas: , Blog, Challenges No comments

Bien, este fue uno de los problemas que más me puso a echar cabeza jejeje. primero porque no encontraba una forma adecuada de plantear la solución y segundo porque en los primeros 3 envios obtenia un error del tipo Time Limit Exceeded.

Basicamente el problema consistia en hallar la última potencia de 2, antes de un número dado. Ejemplo :
Número : 5
2, 4 = 4 Es la potencia de dos antes del número 5 (Porque la siguiente potencia es 8)

Número : 12
2, 4, 8 = 8 Es la potencia de dos antes del número 12 (Porque la siguiente potencia es 16)

Consideraciones a tener en cuenta

+ Para optimizar código que requiere mucho proceso con números, es mejor buscar alguna formula que sea equivalente a la solución y reduzca el proceso de la aplicación.

+ Para optimizar la respuesta de un programa que maneja bucles, es mucho mejor almacenar la respuesta en un Objeto, por ejemplo
StringBuilder y luego del bucle hacer la impresión de los resultados, ya que se consume mucha más memoria
procesar e imprimir en cada iteración.

Solución

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Odd {
	public static void main(String[] args) throws IOException{
		//Objeto para la lectura de datos por teclado
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//Cantidad de entradas a procesar en el programa
		int lines = Integer.parseInt(br.readLine());
		//Objeto para almacenar los resultados
		StringBuilder sb = new StringBuilder();
		//Ingreso de todas las entradas y almacenamiento de la respuesta
		for (int i = 0; i < lines; i++) {
			int members = Integer.parseInt(br.readLine());
			sb.append(getCrewMember(members)).append("\n");
		}
		//Impresión del resultado
		System.out.println(sb);
	}
	
	/**
	 *  Metodo que se encarga de obtener la última potencia de 2, antes de un número dado
	 **/
	public static int getCrewMember(int m){
		int member = 2;
		while(member * 2 <= m){
			member *= 2;
		}
		return member;
	}
}

Solucionando : ATM

Etiquetas: , Blog, Challenges No comments

Bien este es otro de los ejercicios de practica de codechef, en esta ocación el ejercicio a resolver trata de una operación realizada al momento de retirar dinero de un cajero.

Consideraciones a tener en cuenta

+ Para definir el formato numerico en la salida de un resultado,  es muy util utilizar las clases DecimalFormat y DecimalFormatSymbols.

+ Cuando se utiliza una operación del tipo : variable -= cosa1 – cosa2, se aplica ley de signos, por lo tanto puede cambiar el resultado de la operación. Asi que en este caso lo que se hace es utilizar la operación de la forma : variable = variable – cosa1 – cosa2.

 

import java.util.Scanner;
class ATM {
	public static void main(String[] args){
		//Objeto para la lectura de datos
		Scanner sc = new Scanner(System.in);		
		//Variables del programa
		int amount = sc.nextInt();
		float balance = sc.nextFloat();
		//Condicion del multiplo de 5 y de que exista dinero suficiente
		if((amount % 5 == 0) && balance >= (amount + 0.5) ){
			balance = (float) (balance - amount - 0.5);
		}
		System.out.println(balance);
		
	}
}

Solucionando : Enormous Input

Etiquetas: , Blog, Challenges No comments

Este es uno de los ejercicios de optimización, que a uno lo llevan a sacar conclusiones para el tratamiento de los datos luego de hacer el primer envio y obtener como respuesta : Time Limit Exceeded.  Luego de leer un FAQ proporcionado por la pagina de codechef existe una serie de consideraciones.

Consideraciones a tener en cuenta

+ La clase BufferedReader es mucho más rápida procesando Streams que la clase Scanner.

+ Utilizar variables que ocupen menos espacio en memoria para que la aplicación se ejecute más rápido. Ejemplo : Si el ejercicio se presta para utilizar Integer (int), en vez de Long (long), es preferieble darle la prioridad a los enteros más pequeños.

+ La clase StringTokenizer es de gran utilidad para trabajar con datos que vienen separados por algún espacio, coma, etc… en vez de utilizar el método split() de la clase String.

Solución

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class EnormousInput {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		StringTokenizer st = new StringTokenizer(input);		
		// Lines in the input
		int lines = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		// Times that k is divisible by t
		int times = 0;
		for(int i = 0; i < lines; i++){
			if(Integer.parseInt(br.readLine())%k == 0){
				times++;
			}
		}
		System.out.println(times);
	}
}

Salu2

Solucionando : Turbo Sort

Etiquetas: , Blog, Challenges No comments

Luego de 2 intentos y echarle cabeza para hallar la forma más rápida de obtener un ordenamiento de números e imprimirlo, llegue a esta solución.

Consideraciones a tener en cuenta :

+ La clase Arrays con su metodo sort() ordena un arreglo ascendentemente de forma eficaz.

+ La clase StringBuilder, procesa los streams mucho más rápido que un simple objeto String.

Solución

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
class TurboSort {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//Number of lines
		int lines = Integer.parseInt(br.readLine());
		int[] n = new int[lines];
		//Get the nums
		for (int i = 0; i < n.length; i++) {
			n[i] = Integer.parseInt(br.readLine());
		}
		//Sort the nums
		Arrays.sort(n);
		//Show the nums
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n.length; i++) {
			sb.append(n[i] + "\n");
		}
		System.out.println(sb);
	}
}