Universal Cup Judging System

Universal Cup

時間限制: 15.0 s 記憶體限制: 2048 MB 總分: 100 难度: [顯示] 互動 通信 可 Hack ✓
统计

Este es un problema interactivo. Recuerda vaciar el búfer de salida (flush) después de cada impresión. Para vaciar tu salida, puedes usar:

  • fflush(stdout) o cout.flush() en C/C++;
  • System.out.flush() en Java y Kotlin;
  • sys.stdout.flush() en Python.

problem_16334_77704ec8666e21115ab8bd1ebbcde701.png
El concepto del juego, ilustrado por Nano Banana Pro.

Estás participando en un juego estratégico por turnos conocido como Revolver Roulette.

El juego comienza con un revólver cargado con exactamente $6$ balas. Cada bala es real (live) o de fogueo (blank), de forma independiente y con igual probabilidad. Ambos jugadores conocen en todo momento las cantidades actuales de balas reales y de fogueo que quedan en el tambor, pero el orden exacto es desconocido.

Cada jugador comienza con $5$ puntos de salud (HP) y $2$ objetos. Si el HP de un jugador cae a $0$ o menos, queda eliminado y el otro jugador gana. Los jugadores se turnan para realizar acciones.

Procedimiento del Turno

Durante su turno, el jugador activo puede realizar cualquier número de las siguientes acciones:

  • Usar cualquier objeto.
  • Realizar cualquier acción de disparo.

El turno termina únicamente cuando una acción de disparo hace que el turno pase al otro jugador, o cuando algún jugador es eliminado.

Acciones de Disparo

El jugador activo debe elegir una de las siguientes acciones de disparo:

  • Fire at Opponent: El jugador activo dispara la siguiente bala al otro jugador. Si es real, el otro jugador pierde $1$ HP. Independientemente del tipo de bala, el turno pasa al otro jugador.
  • Fire at Self: El jugador activo se dispara la siguiente bala a sí mismo. Si es real, el jugador activo pierde $1$ HP y el turno pasa al otro jugador. De lo contrario, si es de fogueo, el jugador activo conserva el turno y continúa realizando acciones.

Objetos

Cuando se usa un objeto, este se consume y el jugador activo conserva el turno, independientemente del tipo de objeto. Los objetos son visibles para ambos jugadores. Cuando un jugador obtiene un objeto nuevo (incluidos cada uno de los objetos iniciales), se elige de manera uniforme al azar entre los cuatro tipos siguientes:

  • Dummy: Dispara la siguiente bala a un muñeco de entrenamiento. Esto consume la bala y no se considera una acción de disparo.
  • Magnifier: Espía la siguiente bala para revelar si es real o de fogueo. Ambos jugadores conocen el resultado.
  • Converter: Invierte el tipo de la siguiente bala (real $\leftrightarrow$ de fogueo). Ambos jugadores observan las cantidades actualizadas de balas reales y de fogueo.
  • Cage: Obtiene un efecto de un solo uso que evita que el turno termine en la siguiente acción de disparo que normalmente lo terminaría. Específicamente:

    • Si el jugador realiza más tarde Fire at Opponent (independientemente de si la bala es real o de fogueo), el efecto se aplica y el turno no termina.
    • Si el jugador realiza más tarde Fire at Self y la bala es real, el efecto se aplica y el turno no termina (el jugador aún pierde $1$ HP, pero conserva el turno).

    El efecto se consume inmediatamente después de aplicarse una vez. Se puede usar como máximo un objeto Cage por turno.

Recarga (Reloading)

Cuando el tambor queda vacío, se cargan inmediatamente $6$ balas nuevas (cada una independientemente real o de fogueo con igual probabilidad). Ambos jugadores son informados de las nuevas cantidades de balas reales y de fogueo. Además, a cada jugador se le reabastece hasta tener $2$ objetos (un jugador con $k$ objetos recibe $(2 - k)$ objetos nuevos, cada uno elegido de forma independiente y uniforme al azar entre los cuatro tipos anteriores).

Objetivo

Eres el jugador que toma el primer turno y tu objetivo es ganar el juego eliminando a tu oponente.

Entrada

La primera línea contiene dos enteros $n$ y $w$, indicando que necesitas ganar al menos $w$ de $n$ partidas para obtener el veredicto aceptado. Solo hay tres pruebas:

  • Prueba de ejemplo: $n = 1$ y $w = 0$. ($0\%$)
  • Prueba secreta 1: $n = 2\,000$ y $w = 1\,000$. ($50\%$)
  • Prueba secreta 2: $n = 20\,000$ y $w = 11\,000$. ($55\%$)

Se puede demostrar que, cuando ambos jugadores juegan de manera óptima, el jugador que toma el primer turno gana aproximadamente el $56.89\%$ de las partidas.

Protocolo de Interacción

Inicio de la Partida

Tu solución actúa como el jugador que toma el primer turno contra el interactor. Al comienzo de cada partida, el interactor imprime un entero $g$:

  • Si $g = 0$, todas las partidas de la ejecución actual han concluido. Tu solución debe terminar inmediatamente.
  • En caso contrario, $g$ es el índice de la partida actual ($1 \le g \le n$).

Debido a problemas técnicos, tu solución se ejecuta dos veces en cada prueba:

  • El interactor puede decidir si reinicia tu solución entregando $g = 0$ en cualquier momento.

Recibirás los mismos $n$ y $w$ en cada ejecución de una prueba. Por lo tanto, $n$ no siempre es igual al número de partidas en la ejecución actual. Se garantiza que cada partida $1, \dots, n$ se juega exactamente una vez entre las dos ejecuciones. Aparte de esto, tu solución puede ignorar de forma segura la condición de doble ejecución.

Estado de la Partida

A continuación, el interactor imprime la línea de estado de la partida que contiene $13$ enteros no negativos:

$$t \quad l \quad b \quad h_1 \quad d_1 \quad m_1 \quad c_1 \quad k_1 \quad h_2 \quad d_2 \quad m_2 \quad c_2 \quad k_2$$

  • $t \in \{0, 1, 2\}$: estado del turno.
  • $l, b$ ($1 \le l + b \le 6$): las cantidades actuales de balas reales y de fogueo que quedan en el tambor.
  • $h_1$ ($0 \le h_1 \le 5$): tu HP actual.
  • $d_1, m_1, c_1, k_1$ ($0 \le d_1 + m_1 + c_1 + k_1 \le 2$): la cantidad de objetos Dummy, Magnifier, Converter y Cage que tienes actualmente.
  • $h_2$ ($0 \le h_2 \le 5$): el HP actual de tu oponente.
  • $d_2, m_2, c_2, k_2$ ($0 \le d_2 + m_2 + c_2 + k_2 \le 2$): la cantidad de objetos Dummy, Magnifier, Converter y Cage que tiene tu oponente.

Caso $t = 0$ (Partida Terminada)

La partida actual ha terminado. El interactor procede a la siguiente partida (imprimiendo el nuevo $g$).

Caso $t = 1$ (Tu Turno)

Debes imprimir un entero para elegir una acción:

  1. Fire at Opponent.
  2. Fire at Self.
  3. Usar un objeto Dummy.
  4. Usar un objeto Magnifier.
  5. Usar un objeto Converter.
  6. Usar un objeto Cage.

Si la acción no es válida (por ejemplo, usar un objeto que no tienes o usar un objeto Cage más de una vez en el mismo turno), el estado de la partida permanece sin cambios y el interactor imprime $0$ y la misma línea de estado ($13$ enteros) nuevamente. Aunque sigue siendo tu turno, debes realizar otra acción válida para continuar con la partida.

En caso contrario, la acción es efectiva y el interactor imprime un entero de resultado:

  • Para las acciones $1$–$5$: Devuelve $1$ si la siguiente bala antes de la acción es real, o $2$ si es de fogueo.
  • Para la acción $6$: Devuelve $1$ (no se revela información de la bala).

Luego, el interactor imprime la línea de estado de la partida actualizada.

Caso $t = 2$ (Turno del Oponente)

El interactor simula la acción de tu oponente e imprime dos líneas:

  • El identificador de acción $a \in \{1, \dots, 6\}$.
  • El entero de resultado ($1$ o $2$ según lo descrito anteriormente).

Tu oponente nunca realiza una acción ilegal. Inmediatamente después, el interactor imprime la siguiente línea de estado de la partida ($13$ enteros).

Para cada ronda de la partida, el simulador utiliza un generador de números pseudoaleatorios con una semilla aleatoria fija. Además, el oponente en el interactor emplea una estrategia determinista. La decisión de reiniciar tu solución es independiente del procedimiento de interacción. Por lo tanto, la misma secuencia de acciones siempre conduce al mismo estado de la partida.

Se proporciona una herramienta de prueba para ayudarte a desarrollar y probar tu solución.

Ejemplo

Ejemplo 1, Pase 1

Entrada
1 0
1
1 3 3 5 0 0 0 2 5 1 0 1 0

1
1 3 3 5 0 0 0 1 5 1 0 1 0

1
1 2 3 5 0 0 0 1 4 1 0 1 0

0
1 2 3 5 0 0 0 1 4 1 0 1 0

2
1 2 2 5 0 0 0 1 4 1 0 1 0

1
2 1 2 5 0 0 0 1 3 1 0 1 0
5
2
2 2 1 5 0 0 0 1 3 1 0 0 0
1
1
1 1 1 4 0 0 0 1 3 1 0 0 0

1
2 0 1 4 0 0 0 1 2 1 0 0 0
3
2
2 2 4 4 0 1 0 1 2 0 1 0 1
2
1
1 1 4 4 0 1 0 1 1 0 1 0 1

1
1 1 4 4 0 0 0 1 1 0 1 0 1

1
0 0 4 4 0 0 0 1 0 0 1 0 1
0
Salida


6


1


6


2


1








1








4


1

Ejemplo 1, Pase 2

Entrada
1 0
0
Salida
		

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.