0votos

Maximo de equipos en Haskell

por josejuan hace 4 años

No se quien lo ha redactado pero el enunciado está pésimamente explicado. ¿Qué carajo es "sacar"?. Mi solución con explicación de qué he entendido (hipótesis por deducción).

Obtener el maximo de equipos que pueden crearse de un grupo de Alumos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{- 
    (Según entiendo yo el enunciado) 
 
    Hay H hombres y M mujeres y se desean hacer el máximo número de equipos 
    posibles formados por exactamente 2 hombres y 1 mujer cada equipo. 
 
    Antes de formar los equipos, deben eliminarse P personas de entre todos los 
    hombres y mujeres (de entre las H + M personas), dando igual si se eliminan 
    hombres o mujeres. 
 
    Por ejemplo, si es H=3, M=1 y P=1 entonces nos dicen que de las 4 personas 
    debemos eliminar a una, si elimináramos una mujer, no podríamos formar 
    ningún grupo, pero si eliminamos un hombre, nos quedan aún 2 hombres y una 
    mujer, suficiente para formar un equipo. 
-} 
nequipos h m a = min ((h - i) `div` 2) (m - a + i) 
                 where i = (h - 2 * m + 2 * a) `div` 3 
4 comentarios
0votos

Escrito por Sayd hace 4 años

Bueno para empezar "sacar" según la RAE significa:

"Quitar, apartar a alguien o algo del sitio o condición en que se halla"

Tambien podria haber utilizado algunos sinónimos como "Excluir","Retirar","Remover",etc.
Supongo, que por la diferencia de region del español algunas terminologias no se utilizen y den como resultado confusiones como esta. Lamento que hayas tenido problemas con la redacción del problema trataré de cuidar la ambiguedad de las palabras de ahora en adelante.

Por otra parte tu conclusión acerca del enunciado es totalmente correcta pero me debes una impresión de los resultados del programa.
1votos

Escrito por josejuan hace 4 años

@Sayd, no se trata de la palabra "sacar", se trata de que no queda claro qué debe sacarse, por ejemplo, nada impide que P sea el número de alumnos que serán sacados para formar los equipos; de hecho, puesto que se trata de que "sólo los mejores pueden participar", mi primera impresión era esa.

Pero vamos, que tanto hay desafíos mal explicados como algunos que he sido yo quien no ha visto algo evidente, no hay nada que lamentar; perdón si he parecido rudo, me suele pasar :/

El coste del algoritmo es constante, simplemente es calcular el corte entre dos líneas, faltan algunas acotaciones (luego mi respuesta rápida está mal), con las acotaciones es:
nequipos h m a = max 0 $ min ((h - i) `div` 2) (m - a + i)
                 where i = max 0 $ min a $ (h - 2 * m + 2 * a) `div` 3


Y resultados pueden ser:
> mapM (const $ randomRIO (0, 20)) [1..40] >>= \rs -> mapM_ print [((h,m,a), nequipos h m a) | r <- tails rs, length r > 2, let (h:m:a:_) = r, a<(h+m)]
((20,0,12),0)
((0,12,9),0)
((12,9,12),3)
((9,12,2),4)
((2,15,0),1)
((15,0,12),0)
((0,12,1),0)
((12,1,5),1)
((5,20,9),2)
((20,9,9),6)
((9,9,0),4)
((0,20,12),0)
((20,12,12),6)
((12,12,20),1)
((12,20,5),6)
((20,5,19),2)
((5,19,3),2)
((19,3,8),3)
((3,8,3),1)
((8,3,2),3)
((2,12,5),1)
((12,5,4),4)
((5,4,2),2)
((4,2,0),2)
((9,20,11),4)
((20,11,5),8)
((11,5,11),1)
((5,11,4),2)
((11,4,12),1)
((12,16,11),5)
((16,11,17),3)
0votos

Escrito por Sayd hace 4 años

No te preocupes, revise el enunciado y relmente era pésimo. Lo he corregido pero aún me cuesta plantear el problema en lenguaje natural.

Por otra parte tu solución al problema es correcta tambien te dejo mi solucón procedural :D
0votos

Escrito por Sayd hace 4 años

public class Prueba
{
public void start(int n,int m,int s)
{
int sobrantes = 0;
int maxDos = n/2;

if(maxDos <= m){
sobrantes = m-maxDos;
}else{
sobrantes = (maxDos-m)*2;
maxDos -= (maxDos-m);
}
sobrantes+= (n%2==0)?0:1;

if(sobrantes >= s) System.out.println(maxDos);
else{
int fin = (maxDos*3) - (s-sobrantes);
System.out.println((fin/3));
}
}

public static void main(String[] args)
{
Prueba _1 = new Prueba();
_1.start(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]) );
}
}

/*
javac Prueba.java

java Prueba 20 0 12
0
java Prueba 0 12 9
0
java Prueba 12 9 12
3
java Prueba 9 12 2
4
java Prueba 2 15 0
1
java Prueba 15 0 12
0
java Prueba 12 1 5
1
java Prueba 20 11 5
8
java Prueba 16 11 17
3
*/

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.