Universal Cup Judging System

Universal Cup

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

Ceci est un problème interactif. N'oubliez pas de vider le tampon de sortie (flush) après chaque affichage. Pour vider votre sortie, vous pouvez utiliser :

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

problem_16334_77704ec8666e21115ab8bd1ebbcde701.png
Le concept du jeu, illustré par Nano Banana Pro.

Vous participez à un jeu stratégique au tour par tour connu sous le nom de Revolver Roulette.

La partie commence avec un revolver chargé d'exactement $6$ balles. Chaque balle est soit réelle (live), soit à blanc (blank), indépendamment et avec une probabilité égale. Les deux joueurs connaissent toujours le nombre actuel de balles réelles et à blanc restantes dans le barillet, mais leur ordre exact est inconnu.

Chaque joueur commence avec $5$ points de vie (HP) et $2$ objets. Si les HP d'un joueur tombent à $0$ ou moins, il est éliminé et l'autre joueur gagne. Les joueurs effectuent des actions à tour de rôle.

Déroulement d'un tour

Pendant son tour, le joueur actif peut effectuer un nombre quelconque des actions suivantes :

  • Utiliser n'importe quel objet.
  • Effectuer n'importe quelle action de tir.

Le tour ne se termine que lorsqu'une action de tir fait passer le tour à l'autre joueur, ou lorsqu'un joueur est éliminé.

Actions de tir

Le joueur actif doit choisir l'une des actions de tir suivantes :

  • Fire at Opponent : Le joueur actif tire la prochaine balle sur l'autre joueur. Si elle est réelle, l'autre joueur perd $1$ HP. Quel que soit le type de balle, le tour passe à l'autre joueur.
  • Fire at Self : Le joueur actif se tire la prochaine balle sur lui-même. Si elle est réelle, le joueur actif perd $1$ HP et le tour passe à l'autre joueur. Sinon, si c'est une balle à blanc, le joueur actif conserve son tour et continue d'effectuer des actions.

Objets

Lorsqu'un objet est utilisé, il est consommé et le joueur actif conserve son tour, quel que soit le type d'objet. Les objets sont visibles par les deux joueurs. Lorsqu'un joueur obtient un nouvel objet (y compris chacun des objets initiaux), celui-ci est choisi uniformément au hasard parmi les quatre types suivants :

  • Dummy : Tire la prochaine balle sur un mannequin d'entraînement. Cela consomme la balle et n'est pas considéré comme une action de tir.
  • Magnifier : Regarde la prochaine balle pour révéler si elle est réelle ou à blanc. Les deux joueurs apprennent le résultat.
  • Converter : Inverse le type de la prochaine balle (réelle $\leftrightarrow$ à blanc). Les deux joueurs observent les nombres mis à jour de balles réelles et à blanc.
  • Cage : Confère un effet à usage unique qui empêche le tour de se terminer lors de la prochaine action de tir qui devrait normalement y mettre fin. Plus précisément :

    • Si le joueur effectue ensuite Fire at Opponent (que la balle soit réelle ou à blanc), l'effet s'applique et le tour ne se termine pas.
    • Si le joueur effectue ensuite Fire at Self et que la balle est réelle, l'effet s'applique et le tour ne se termine pas (le joueur perd tout de même $1$ HP, mais conserve son tour).

    L'effet est consommé immédiatement après s'être appliqué une fois. Au plus un objet Cage peut être utilisé par tour.

Rechargement (Reloading)

Lorsque le barillet est vide, $6$ nouvelles balles sont immédiatement chargées (chacune étant indépendamment réelle ou à blanc avec une probabilité égale). Les deux joueurs sont informés des nouveaux nombres de balles réelles et à blanc. De plus, chaque joueur reçoit des objets jusqu'à en avoir $2$ (un joueur ayant $k$ objets reçoit $(2 - k)$ nouveaux objets, chacun choisi indépendamment et uniformément au hasard parmi les quatre types ci-dessus).

Objectif

Vous êtes le joueur qui joue le premier tour, et votre objectif est de gagner la partie en éliminant votre adversaire.

Entrée

La première ligne contient deux entiers $n$ et $w$, indiquant que vous devez gagner au moins $w$ parties sur $n$ pour que votre solution soit acceptée. Il n'y a que trois tests :

  • Test d'exemple : $n = 1$ et $w = 0$. ($0\%$)
  • Test secret 1 : $n = 2\,000$ et $w = 1\,000$. ($50\%$)
  • Test secret 2 : $n = 20\,000$ et $w = 11\,000$. ($55\%$)

On peut montrer que lorsque les deux joueurs jouent de manière optimale, le joueur qui joue le premier tour gagne environ $56.89\%$ des parties.

Protocole d'interaction

Début de partie

Votre solution agit en tant que joueur jouant le premier tour contre l'interacteur. Au début de chaque partie, l'interacteur affiche un entier $g$ :

  • Si $g = 0$, toutes les parties de l'exécution actuelle sont terminées. Votre solution doit se terminer immédiatement.
  • Sinon, $g$ est l'indice de la partie actuelle ($1 \le g \le n$).

En raison de problèmes techniques, votre solution est exécutée deux fois sur chaque test :

  • L'interacteur peut décider de redémarrer votre solution en envoyant $g = 0$ à tout moment.

Vous recevrez les mêmes valeurs $n$ et $w$ pour chaque exécution d'un test. Par conséquent, $n$ n'est pas toujours égal au nombre de parties dans l'exécution en cours. Il est garanti que chaque partie $1, \dots, n$ est jouée exactement une fois sur l'ensemble des deux exécutions. En dehors de cela, votre solution peut ignorer sans risque la condition de double exécution.

État de la partie

Ensuite, l'interacteur affiche la ligne d'état de la partie contenant $13$ entiers naturels :

$$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\}$ : statut du tour.
  • $l, b$ ($1 \le l + b \le 6$) : nombres actuels de balles réelles et à blanc restantes dans le barillet.
  • $h_1$ ($0 \le h_1 \le 5$) : vos HP actuels.
  • $d_1, m_1, c_1, k_1$ ($0 \le d_1 + m_1 + c_1 + k_1 \le 2$) : le nombre d'objets Dummy, Magnifier, Converter et Cage que vous détenez actuellement.
  • $h_2$ ($0 \le h_2 \le 5$) : les HP actuels de votre adversaire.
  • $d_2, m_2, c_2, k_2$ ($0 \le d_2 + m_2 + c_2 + k_2 \le 2$) : le nombre d'objets Dummy, Magnifier, Converter et Cage que détient votre adversaire.

Cas $t = 0$ (Fin de partie)

La partie actuelle est terminée. L'interacteur passe à la partie suivante (en affichant le nouveau $g$).

Cas $t = 1$ (Votre tour)

Vous devez afficher un entier pour choisir une action :

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

Si l'action est invalide (par exemple, utiliser un objet que vous n'avez pas, ou utiliser un objet Cage plus d'une fois au cours du même tour), l'état de la partie reste inchangé, l'interacteur affiche $0$ et réaffiche la même ligne d'état ($13$ entiers). Bien que ce soit toujours votre tour, vous devez effectuer une autre action valide pour poursuivre la partie.

Sinon, l'action est prise en compte et l'interacteur affiche un entier de résultat :

  • Pour les actions $1$–$5$ : Renvoie $1$ si la prochaine balle avant l'action est réelle, $2$ si elle est à blanc.
  • Pour l'action $6$ : Renvoie $1$ (aucune information sur la balle n'est révélée).

L'interacteur affiche ensuite la ligne d'état de la partie mise à jour.

Cas $t = 2$ (Tour de l'adversaire)

L'interacteur simule l'action de votre adversaire et affiche deux lignes :

  • L'identifiant de l'action $a \in \{1, \dots, 6\}$.
  • L'entier de résultat ($1$ ou $2$ comme décrit ci-dessus).

Votre adversaire n'effectue jamais d'action illégale. Immédiatement après, l'interacteur affiche la ligne d'état suivante ($13$ entiers).

Pour chaque manche de la partie, le simulateur de jeu utilise un générateur de nombres pseudo-aléatoires avec une graine (seed) fixe. De plus, l'adversaire dans l'interacteur emploie une stratégie déterministe. La décision de redémarrer votre solution est indépendante de la procédure d'interaction. Par conséquent, la même séquence d'actions mène toujours au même état de jeu.

Un outil de test est fourni pour vous aider à développer et tester votre solution.

Exemple

Exemple 1, Passe 1

Entrée
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
Sortie


6


1


6


2


1








1








4


1

Exemple 1, Passe 2

Entrée
1 0
0
Sortie
		

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.