Universal Cup Judging System

Universal Cup

时间限制: 15.0 s 内存限制: 2048 MB 总分: 100 难度: [显示] 交互 通信 可 Hack ✓
统计

Tämä on vuorovaikutteinen tehtävä. Muista tyhjentää tulostepuskuri (flush) jokaisen tulostuksen jälkeen. Voit tyhjentää tulostepuskurin seuraavasti:

  • fflush(stdout) tai cout.flush() C/C++:ssa;
  • System.out.flush() Javassa ja Kotlinissa;
  • sys.stdout.flush() Pythonissa.

problem_16334_77704ec8666e21115ab8bd1ebbcde701.png
Pelin konsepti Nano Banana Pron kuvittamana.

Osallistut vuoropohjaiseen strategiapeliin nimeltä Revolver Roulette.

Peli alkaa revolverilla, johon on ladattu täsmälleen $6$ luotia. Jokainen luoti on toisistaan riippumatta ja yhtä suurella todennäköisyydellä joko kova (live) tai paukkupatruuna (blank). Molemmat pelaajat tietävät aina rullassa jäljellä olevien kovien luotien ja paukkupatruunoiden senhetkisen lukumäärän, mutta niiden tarkka järjestys on tuntematon.

Kumpikin pelaaja aloittaa $5$ terveyspisteellä (HP) ja $2$ esineellä. Jos pelaajan HP putoaa $0$:aan tai sen alle, hänet eliminoidaan ja toinen pelaaja voittaa. Pelaajat suorittavat toimintoja vuorotellen.

Vuoron kulku

Vuoronsa aikana aktiivinen pelaaja voi suorittaa minkä tahansa määrän seuraavia toimintoja:

  • Käyttää minkä tahansa esineen.
  • Suorittaa minkä tahansa ampumistoiminnon.

Vuoro päättyy vain silloin, kun ampumistoiminto siirtää vuoron toiselle pelaajalle tai kun jompikumpi pelaaja eliminoidaan.

Ampumistoiminnot

Aktiivisen pelaajan on valittava yksi seuraavista ampumistoiminnoista:

  • Fire at Opponent: Aktiivinen pelaaja ampuu seuraavan luodin toista pelaajaa kohti. Jos luoti on kova, toinen pelaaja menettää $1$ HP. Luodin tyypistä riippumatta vuoro siirtyy toiselle pelaajalle.
  • Fire at Self: Aktiivinen pelaaja ampuu seuraavan luodin itseään kohti. Jos luoti on kova, aktiivinen pelaaja menettää $1$ HP ja vuoro siirtyy toiselle pelaajalle. Muussa tapauksessa, jos kyseessä on paukkupatruuna, aktiivinen pelaaja säilyttää vuoronsa ja jatkaa toimintojen suorittamista.

Esineet

Kun esine käytetään, se kuluu pois ja aktiivinen pelaaja säilyttää vuoronsa esineen tyypistä riippumatta. Esineet ovat molempien pelaajien nähtävissä. Kun pelaaja saa uuden esineen (mukaan lukien jokaisen alkuesineen), se valitaan tasajakautuneesti satunnaisesti seuraavista neljästä tyypistä:

  • Dummy: Ammu seuraava luoti harjoitusnukkeen. Tämä kuluttaa luodin, eikä sitä lasketa ampumistoiminnoksi.
  • Magnifier: Kurkista seuraavaan luotiin paljastaaksesi, onko se kova vai paukkupatruuna. Molemmat pelaajat saavat tietää tuloksen.
  • Converter: Käännä seuraavan luodin tyyppi päinvastaiseksi (kova $\leftrightarrow$ paukkupatruuna). Molemmat pelaajat näkevät päivitetyt kovien luotien ja paukkupatruunoiden lukumäärät.
  • Cage: Saa kertakäyttöinen vaikutus, joka estää vuoron päättymisen seuraavalla ampumistoiminnolla, joka normaalisti päättäisi vuoron. Tarkemmin:

    • Jos pelaaja suorittaa myöhemmin toiminnon Fire at Opponent (riippumatta siitä, onko luoti kova vai paukkupatruuna), vaikutus astuu voimaan eikä vuoro pääty.
    • Jos pelaaja suorittaa myöhemmin toiminnon Fire at Self ja luoti on kova, vaikutus astuu voimaan eikä vuoro pääty (pelaaja menettää silti $1$ HP, mutta säilyttää vuoronsa).

    Vaikutus kuluu pois välittömästi sen jälkeen, kun se on lauennut kerran. Vuoroa kohti saa käyttää enintään yhden Cage-esineen.

Uudelleenlataus (Reloading)

Kun rulla on tyhjä, siihen ladataan välittömästi $6$ uutta luotia (jokainen toisistaan riippumatta kova tai paukkupatruuna yhtä suurella todennäköisyydellä). Molemmille pelaajille ilmoitetaan uudet kovien luotien ja paukkupatruunoiden lukumäärät. Lisäksi kummankin pelaajan esineet täydennetään enintään $2$ esineeseen (pelaaja, jolla on $k$ esinettä, saa $(2 - k)$ uutta esinettä, joista jokainen valitaan toisistaan riippumatta ja tasajakautuneesti satunnaisesti yllä olevista neljästä tyypistä).

Tavoite

Olet pelaaja, joka aloittaa ensimmäisen vuoron, ja tavoitteenasi on voittaa peli eliminoimalla vastustajasi.

Syöte

Ensimmäinen rivi sisältää kaksi kokonaislukua $n$ ja $w$, jotka ilmoittavat, että sinun on voitettava vähintään $w$ peliä $n$:stä saadaksesi hyväksytyn tuloksen. Testejä on vain kolme:

  • Esimerkkitesti: $n = 1$ ja $w = 0$. ($0\%$)
  • Salainen testi 1: $n = 2\,000$ ja $w = 1\,000$. ($50\%$)
  • Salainen testi 2: $n = 20\,000$ ja $w = 11\,000$. ($55\%$)

Voidaan osoittaa, että kun molemmat pelaajat pelaavat optimaalisesti, ensimmäisen vuoron pelaava pelaaja voittaa noin $56.89\%$ peleistä.

Vuorovaikutusprotokolla

Pelin aloitus

Ratkaisusi toimii ensimmäisen vuoron pelaajana interaktoria vastaan. Jokaisen pelin alussa interaktori tulostaa kokonaisluvun $g$:

  • Jos $g = 0$, kaikki nykyisen ajokerran pelit ovat päättyneet. Ratkaisusi on lopetettava suorituksensa välittömästi.
  • Muussa tapauksessa $g$ on nykyisen pelin indeksi ($1 \le g \le n$).

Teknisistä syistä ratkaisuasi ajetaan jokaisessa testissä kahdesti:

  • Interaktori voi milloin tahansa päättää käynnistää ratkaisusi uudelleen antamalla $g = 0$.

Saat samat luvut $n$ ja $w$ testin jokaisella ajokerralla. Näin ollen $n$ ei ole aina yhtä suuri kuin nykyisen ajokerran pelien lukumäärä. On taattu, että jokainen peli $1, \dots, n$ pelataan täsmälleen kerran kahden ajokerran aikana yhteensä. Tämän lisäksi ratkaisusi voi turvallisesti jättää kahden ajokerran ehdon huomiotta.

Pelin tila

Seuraavaksi interaktori tulostaa pelin tilarivin, joka sisältää $13$ epänegatiivista kokonaislukua:

$$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\}$: vuoron tila.
  • $l, b$ ($1 \le l + b \le 6$): rullassa tällä hetkellä jäljellä olevien kovien luotien ja paukkupatruunoiden lukumäärät.
  • $h_1$ ($0 \le h_1 \le 5$): nykyinen HP-määräsi.
  • $d_1, m_1, c_1, k_1$ ($0 \le d_1 + m_1 + c_1 + k_1 \le 2$): hallussasi tällä hetkellä olevien Dummy-, Magnifier-, Converter- ja Cage-esineiden lukumäärät.
  • $h_2$ ($0 \le h_2 \le 5$): vastustajasi nykyinen HP-määrä.
  • $d_2, m_2, c_2, k_2$ ($0 \le d_2 + m_2 + c_2 + k_2 \le 2$): vastustajasi hallussa olevien Dummy-, Magnifier-, Converter- ja Cage-esineiden lukumäärät.

Tapaus $t = 0$ (Peli ohi)

Nykyinen peli on päättynyt. Interaktori siirtyy seuraavaan peliin (tulostaen uuden luvun $g$).

Tapaus $t = 1$ (Sinun vuorosi)

Sinun on tulostettava kokonaisluku valitaksesi toiminnon:

  1. Fire at Opponent.
  2. Fire at Self.
  3. Käytä Dummy-esine.
  4. Käytä Magnifier-esine.
  5. Käytä Converter-esine.
  6. Käytä Cage-esine.

Jos toiminto on virheellinen (esim. sellaisen esineen käyttäminen, jota sinulla ei ole, tai Cage-esineen käyttäminen useammin kuin kerran samalla vuorolla), pelin tila pysyy ennallaan, ja interaktori tulostaa luvun $0$ sekä saman tilarivin ($13$ kokonaislukua) uudelleen. Vaikka on edelleen sinun vuorosi, sinun on tehtävä toinen kelvollinen toiminto jatkaaksesi peliä.

Muussa tapauksessa toiminto toteutuu ja interaktori tulostaa tuloskokonaisluvun:

  • Toiminnoille $1$–$5$: Palauttaa $1$, jos seuraava luoti ennen toimintoa on kova, ja $2$, jos se on paukkupatruuna.
  • Toiminnolle $6$: Palauttaa $1$ (luodin tietoja ei paljasteta).

Tämän jälkeen interaktori tulostaa päivitetyn pelin tilarivin.

Tapaus $t = 2$ (Vastustajan vuoro)

Interaktori simuloi vastustajasi toiminnon ja tulostaa kaksi riviä:

  • Toiminnon tunniste $a \in \{1, \dots, 6\}$.
  • Tuloskokonaisluku ($1$ tai $2$ kuten yllä on kuvattu).

Vastustajasi ei koskaan tee sääntöjenvastaista toimintoa. Välittömästi tämän jälkeen interaktori tulostaa seuraavan pelin tilarivin ($13$ kokonaislukua).

Pelin jokaisella kierroksella pelisimulaattori käyttää näennäissatunnaislukugeneraattoria kiinteällä satunnaissiemenellä (seed). Lisäksi interaktorin vastustaja käyttää determinististä strategiaa. Päätös ratkaisusi uudelleenkäynnistämisestä on riippumaton vuorovaikutusprosessista. Siksi sama toimintojen jono johtaa aina samaan pelin tilaan.

Tarjolla on testaustyökalu, jonka avulla voit kehittää ja testata ratkaisuasi.

Esimerkki

Esimerkki 1, Vaihe 1

Syöte
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
Tuloste


6


1


6


2


1








1








4


1

Esimerkki 1, Vaihe 2

Syöte
1 0
0
Tuloste
		

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.