Octava Evaluación de Temas Selectos de Sistemas
Jueves 30 de junio de 2005 (13:00 a 15:55)

Instrucciones: Deberán resolver dos problemas, por lo que me deberán entregar dos códigos fuente, uno para cada problema. Cada problema se evaluará con 10 casos de prueba y cada uno de ellos vale 1 punto. Pongan un comentario en su código indicando los dos integrantes del equipo. La lectura se hará desde la entrada estándar y la escritura hacia la salida estándar. En sus pruebas, usen la redirección de entrada y salida.

Problema 13.6.5: Pastel de cumpleaños (pastel.c, pastel.cpp ó pastel.java)

Lucy y Lily son gemelas. Hoy es su cumpleaños, así que su madre les compra un pastel de cumpleaños. Hay 2N cerezas en el pastel, donde 1 <= N <= 50. Su madre quiere cortar el pastel en dos mitades con un solo corte rectilíneo pasando por el centro de modo que cada gemela tenga tanto la misma cantidad de pastel como el mismo número de cerezas. ¿Podrías ayudarle? El pastel tiene radio 100 y su centro está localizado en (0, 0). Las coordenadas de cada cereza están dadas por dos enteros (x, y). Debes dar una línea en la forma Ax + By = 0, donde A y B son enteros en el intervalo [-500, 500]. No se permite que ninguna cereza esté en la línea de corte. Habrá al menos una solución para cada caso de prueba.



Entrada: La entrada contiene varios casos de prueba. La primera línea de cada caso contiene el entero N. Esto se sigue con 2N líneas, donde cada línea contiene las coordenadas (x, y) de una cereza con un espacio entre ellas. La entrada termina cuando N = 0.

Salida: Para cada caso de prueba, escribe una línea conteniendo a A y a B con un espacio entre ellas. Si hay varias soluciones, cualquiera es buena.

Pistas: Siempre existe una solución para este problema si se elimina el requerimiento de que la línea de corte tenga coordenadas enteras. ¿Podrías probarlo? ¿Habrá alguna solución más eficiente que la de intentar todos los pares posibles A y B?

Ejemplos: Entrada y salida. Para usar este ejemplo, escriban pastel < pastel.ent > pastel.txt y comparen pastel.txt con pastel.sal

Problema 13.6.8: ¿Qué tan grande es? (grande.c, grande.cpp ó grande.java)

Ian irá a California y tiene que empacar sus cosas, incluyendo su colección de círculos. Dado un conjunto de círculos, tu programa debe encontrar la caja rectangular más pequeña en la que quepan. Todos los círculos deben tocar el fondo de la caja. La figura de abajo muestra un empaquetamiento aceptable para un conjunto de círculos, aunque no es necesariamente un empaquetamiento óptimo para estos círculos en particular. En un caso ideal, todo círculo debería tocar al menos alguno otro, pero probablemente ya te habías dado cuenta de esto.



Entrada: La primera línea de la entrada contiene un entero positivo N <= 50, que indica el número de casos de prueba que siguen. Las siguientes N líneas contienen una serie de números separados por espacios. El primer número de cada una de estas líneas es un entero positivo M <= 8, que indica cuántos otros números aparecerán en esa línea. Los siguientes M números en la línea son los radios de los círculos que se deben empacar en una sola caja. Estos números no son necesariamente enteros.

Salida: Para cada caso de prueba, tu programa debe escribir el tamaño (horizontal) del rectángulo más pequeño en el que se pueden empacar los círculos. Cada caso debe ser escrito en una línea separada por sí mismo, con tres dígitos decimales. No escribas ceros al principio de un número a menos que éste sea menor que 1, por ejemplo 0.543.

Pistas: ¿Será mejor ordenar los círculos del mayor al menor o intercalarlos? ¿O será que el orden nunca importa? ¿Servirá de algo hacer búsqueda con retroceso en este problema?

Ejemplos: Entrada y salida. Para usar este ejemplo, escriban grande < grande.ent > grande.txt y comparen grande.txt con grande.sal