Competiré en la OBI (Olimpiada Brasileña de Informática, en inglés) y estoy probando algunos ejercicios de los últimos años. Pero no puedo encontrar una solución para este ejercicio (lo traduje, lo que puede haber algunos errores):Algoritmo de programación: encontrar al ganador de una competencia
Competencia chocolate
Carlos y Paula acaba de conseguir una bolsa de bolas de chocolate. A medida que comerían todo demasiado rápido, hicieron una competición:
- Comerán alternativamente, una después de la otra (Paula comienza siempre).
- Cada vez, solo pueden comer de 1 a M bolas, M decidido por la madre de Paula, para que no se ahoguen.
- Si uno comió K bolas en su turno, el siguiente no puede comer K bolas.
- Quien no puede jugar según las reglas anteriores pierde.
En el siguiente ejemplo, con M = 5 y 20 bolas, Carlos ha ganado:
Who plays How many ate Balls left
20
Paula 5 15
Carlos 4 11
Paula 3 8
Carlos 4 4
Paula 2 2
Carlos 1 1
Tenga en cuenta que, al final, Carlos no podía comer 2 bolas para ganar, porque Paula se comió 2 en su último turno. Pero Paula no pudo comer la última pelota, porque Carlos comió 1 en su último turno, por lo que Paula no puede jugar y pierde.
Ambos son muy inteligentes y funcionan de manera óptima. Si hay una secuencia de turnos que le asegure la victoria independientemente de los turnos del otro, él/ella jugará estas secuencias.
Tarea:
Su tarea es averiguar quién va a ganar la competición si ambos juegan de manera óptima.
de entrada:
La entrada contiene sólo un único grupo de prueba, que se debe leer de la entrada estándar (normalmente el teclado).
La entrada tiene 2 enteros N (2 ≤ N ≤ 1000000) y M (2 ≤ M ≤ 1000), siendo N el número de bolas y M el número permitido por turno.
Salida:
Su programa debe imprimir, en la salida estándar, una línea que contiene el nombre del ganador.
Ejemplos:
Input: Output:
5 3 Paula
20 5 Carlos
5 6 Paula
que han estado tratando de resolver el problema, pero no tienen idea de cómo.
Una solución en C se puede encontrar aquí: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/solucoes/chocolate.c.txt Pero no puedo entender el algoritmo. Alguien publicó una pregunta sobre este problema en otro sitio, pero nadie respondió.
¿Podría explicarme el algoritmo?
Éstos son los resultados esperados del programa: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/gabaritos/chocolate.zip
Su juego suena muy similar al juego [Nim] (http://en.wikipedia.org/wiki/Nim) - tal vez el algoritmo para jugar un juego perfecto sea útil para entender este juego también? – sarnold
Esto podría necesitar ir al foro 'Theoretical CS' –
¿En qué idioma estás tratando de resolverlo? No soy el tipo más inteligente cuando se trata de estos problemas, pero creo que al pasar por un caso simple con un depurador me resulta muy útil para comprender los algoritmos.BRB - Voy a intentar codificar una solución (para entonces supongo que alguien habrá respondido esto) –