Está en la página 1de 2

GoldMine

Aurum Nugget, Inc. es una compaa que acaba de comprar unas minas de oro. La empresa tiene un nmero de mineros disponibles para sacar oro y quieren ponerlos a trabajar en las minas que acaban de comprar de tal manera que se maximice la ganancia. Cada mina contiene un mximo de 6 depsitos de oro y puede albergar un mximo de 6 mineros. Luego de poner una cantidad de mineros la compaa gana (o pierde) dinero de las siguientes maneras: 1. Si la mina tiene menos mineros que depsitos, la compaa gana $60 por cada minero ubicado. 2. Si la mina tiene el mismo nmero de mineros y depsitos, la compaa gana $50 por minero ubicado. 3. Si la mina tiene ms mineros que depsitos, la compaa gana $50 por cada depsito y pierde $20 por cada minero extra. An si la compaa pierde dinero, la compaa debe poner a trabajar a todos los mineros. Planteamiento del problema (Java) Se debe escribir una clase llamada GoldMine (ver Cdigo 1) con un mtodo llamado getAllocation que reciba dos parmetros: String[] mines y int miners y retorne un arreglo de nmeros enteros int[].
public class GoldMine{ int[] getAllocation(String[] mines, int miners){ } }
Cdigo 1: esqueleto de la clase GoldMine y el mtodo getAllocation.

El parmetro mines es un arreglo cadenas de caracteres en donde cada cadena representa una serie de probabilidades para cada mina. Cada elemento est formado por una serie de nmeros representando las probabilidades de la siguiente manera: "aaa, bbb, ccc, ddd, eee, fff, ggg". Por ejemplo, aaa puede ser 010, bbb puede ser 020. La suma de estos siete nmeros debe dar 100. El parmetro miners contiene el nmero de mineros que se debe poner en cada mina. El mtodo debe retornar un arreglo de nmeros de longitud igual al nmero de cadenas enviado donde cada elemento significa el nmero de mineros a trabajar en la mina (el elemento i del arreglo debe corresponder al elemento i de la variable mines). Si hay mltiples soluciones al problema se debe escoger la que maximice la ganancia y la solucin que ponga ms mineros en las primeras minas. Es decir si se comparan dos soluciones X0, X1, X2, ..., Xn e Y0, Y1, Y2, ..., Yn que tienen la misma ganancia, la solucin
1

Tomado de TopCoder: http://community.topcoder.com/stat?c=problem_statement&pm=1957&rd=4650

que se debe entregar es la que tenga un nmero mayor de mineros en su menor ndice. Por ejemplo. Si Xi > Yi, en el primer ndice i donde son diferentes la solucin que se debe retornar es X. Ejemplo Como un caso de entrada, suponga que la compaa compra dos minas y tiene 4 mineros. Los argumentos de entrada son: mines: 4 miners:
"000, 030, 030, 040, 000, 000, 000" "020, 020, 020, 010, 010, 010, 010"

Esto quiere decir que el programa recibe un problema en el que tiene disponibles 4 mineros y debe ponerlos a trabajar en dos minas. Las dos minas estn representadas por la dos cadenas de caracteres. En el caso de la primera mina, los nmeros representan informacin acerca del oro que tiene por dentro: tiene 0% de posibilidades de tener 0 depositos de oro, 30% de tener 1 depsito, 30% de tener 2 depsitos, 40% de tener 3 depsitos y 0% de tener 4, 5 o 6 depsitos. La segunda mina tiene 20% de tener 0,1 o 2 depsitos y 10% de tener 3, 4, 5 o 6 depsitos. En este caso, el programa debe retornar un arreglo de dos nmeros. El conjunto posible de soluciones con la ganancia total es el siguiente:
{ { { { { 0, 1, 2, 3, 4, 4 3 2 1 0 } } } } } : 75 : 132 : 153 : 129 : 67

Es claro que la ganancia mxima esperada corresponde a un valor de 153 y se obtiene con una asignacin de 2 mineros en la primera y 2 mineros en la segunda { 2, 2 }. A continuacin se explica el clculo para obtener la ganancia esperada de la respuesta ptima { 2, 2 }: Primera mina:
0*(-40) +0.3*30 +0.3*100 +0.4*120 +0*(120) +0*(120) +0*(120) = 0 + 9 + 30 + 48 + 0 + 0 + 0 = 87

Segunda Mina:
0.2*(-40) +0.2*30 +0.2*100 +0.1*120 +0.1*120 +0.1*120 +0.1*120 = -8 + 6 + 20 + 12 + 12 + 12 + 12 = 66

Ganancia total esperada:


87 + 66 = 153