QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 256 MB Total points: 100

#20298. Nieśmiertelny konik polny

Statistics

Mehmet, miłośnik gier komputerowych, od 10 godzin gra w Immortal Grasshopper. Immortal Grasshopper to gra komputerowa, w której za pomocą przycisków sterujesz swoją postacią: konikiem polnym będącym mistrzem karate. Twoim przeciwnikiem jest mrówka sterowana przez komputer.

Konik polny może wykonywać łącznie $S$ ($1 \le S \le 4$) różnych ataków. Ataki te są nazwane pierwszymi $S$ literami alfabetu. Na przykład:

  • $S = 2$: ataki mają nazwy $A$, $B$.
  • $S = 4$: ataki mają nazwy $A$, $B$, $C$, $D$.

Każdy atak, który trafi przeciwnika, zadaje 1 punkt obrażeń.

Chociaż znasz zasady gry, Mehmet zasnął po 10 godzinach grania, więc nie ma nikogo, kto nauczyłby cię sterowania. Na stole znalazłeś kontroler z $N$ przyciskami (przyciski są ponumerowane od $0$ do $N - 1$). Po chwili grania zorientowałeś się, że każdy przycisk wykonuje jeden z $S$ różnych ataków, ale nie wiesz, który przycisk wykonuje jaki atak. Na szczęście dzięki naklejce na pierwszym przycisku widzisz, że wykonuje on atak typu $A$. Ponadto wiesz, że każdy rodzaj ataku jest przypisany do co najmniej jednego przycisku.

Twoim zadaniem jest ustalenie, grając w tę grę, jakie rodzaje ataków wykonują wszystkie przyciski kontrolera.

Grasz w sposób opisany poniżej. Aby zaatakować przeciwnika — mrówkę — używasz sekwencji przycisków zwanych kombinacjami. Kombinacja działa następująco:

  • Tworzysz kombinację, naciskając kolejno dowolną liczbę przycisków.
  • W obrębie kombinacji możesz naciskać przyciski w dowolnej kolejności.
  • Ten sam przycisk można nacisnąć w kombinacji wielokrotnie.
  • Kombinacja może mieć długość co najwyżej $400$.

Gra przyjmuje twoje ruchy i na koniec pokazuje łączne zadane przez ciebie obrażenia.

Obrażenia zadawane mrówce przez kombinację oblicza się następująco. Niech $t(X)$ oznacza atak, który w kolejności alfabetycznej następuje bezpośrednio po ataku $X$. Dla ataku oznaczonego ostatnią literą wartość $t(X)$ definiuje się jako atak $A$. Na przykład:

  • Dla $S = 4$: $t(A) = B$, $t(B) = C$, $t(C) = D$, $t(D) = A$.
  • Dla $S = 2$: $t(A) = B$, $t(B) = A$.

Mrówka może przeciwdziałać niektórym twoim atakom za pomocą podstępnych taktyk. Dokładniej, jeśli twoim ostatnim udanym (niezablokowanym) atakiem, który zadał obrażenia, był atak $X$, a jako następnego ataku użyjesz $t(X)$, mrówka zablokuje ten atak $t(X)$ i nie zadasz obrażeń. Jeśli nie może go zablokować, zadasz mrówce 1 punkt obrażeń (pierwszy atak zawsze zadaje obrażenia).

Twoim celem jest ustalenie i podanie ataków wykonywanych przez wszystkie przyciski przy użyciu jak najmniejszej łącznej liczby kombinacji.

Szczegóły implementacji

Należy zaimplementować następującą funkcję:

std::string olumsuz_cekirge(int N, int S)
  • Wartość $N$ oznacza liczbę przycisków na kontrolerze.
  • Wartość $S$ oznacza liczbę różnych rodzajów ataków w grze.
  • Funkcja powinna zwrócić string długości $N$, reprezentujący ataki przypisane do przycisków.

W tym celu możesz korzystać z poniższej funkcji kombo:

int kombo(std::vector<int> buton)
  • Podczas każdego wywołania olumsuz_cekirge możesz wywołać funkcję kombo co najwyżej $400$ razy.
  • Tablica buton określa indeksy przycisków, których chcesz użyć w kombinacji.
  • Wartości w tablicy buton muszą być liczbami całkowitymi od $0$ do $N - 1$.
  • Długość tablicy buton może wynosić co najwyżej $400$.

W każdym teście należy rozwiązać $T$ niezależnych scenariuszy z tymi samymi wartościami $N$ i $S$. Dla każdego niezależnego scenariusza funkcja olumsuz_cekirge zostanie wywołana raz.

Ograniczenia

  • $1 \le T \le 100$
  • $4 \le N \le 400$
  • $1 \le S \le 4$
  • Program oceniający nie jest adaptacyjny. Dokładniej, dane wejściowe są ustalone przed wywołaniem funkcji olumsuz_cekirge i nie zmieniają się podczas wykonywania operacji.

Podzadania

Liczba punktów za $i$-te podzadanie wynosi $0$, jeśli w dowolnym scenariuszu funkcja kombo zostanie wywołana z parametrami niespełniającymi powyższych warunków lub funkcja olumsuz_cekirge zwróci niepoprawny wynik. W przeciwnym razie liczba punktów jest równa wartości następującego wzoru:

$$P_i \times \min\left(1,\left(\frac{400-q}{400-Q_i}\right)^3\right)$$

  • Wartość $P_i$ oznacza maksymalną łączną liczbę punktów, którą można otrzymać za $i$-te podzadanie.
  • Wartość $q$ oznacza maksymalną liczbę wywołań funkcji kombo w jednym scenariuszu spośród scenariuszy we wszystkich testach $i$-tego podzadania.
  • Wartości $Q_i$ podano w opisach podzadań.
Podzadania Punkty Dodatkowe ograniczenia Zależności
1 1 $S = 1, Q_1 = 0, P_1 = 1$ —
2 15 $S = 2, Q_2 = 50, P_2 = 15$ —
3 40 $S = 3, Q_3 = 80, P_3 = 40$ —
4 44 $S = 4, Q_4 = 103, P_4 = 44$ —

Przykład

olumsuz_cekirge(6, 3)

W przykładach ataki odpowiadające kolejnym przyciskom to ABCBBA, więc funkcja powinna zwrócić ten napis.

kombo([0, 1, 2])

Powyższe wywołanie zwraca $2$. Ataki w tej kombinacji to $ABC$. Pierwszy atak $A$ trafia. Atak $B$ zostaje zablokowany. Ponieważ ostatnim atakiem, który zadał obrażenia, był $A$, mrówka nie może zablokować ataku $C$ i otrzymuje obrażenia.

kombo([0, 0, 0])

Powyższe wywołanie zwraca $3$. Ataki w tej kombinacji to $AAA$. Wszystkie ataki $A$ zadają obrażenia.

kombo([5, 1, 3, 2, 2, 0])

Powyższe wywołanie zwraca $3$. Ataki w tej kombinacji to $ABBCCA$. Pierwszy atak $A$ trafia. Atak $B$ zostaje zablokowany. Ponieważ ostatnim trafionym atakiem nadal jest $A$, drugi atak $B$ również zostaje zablokowany. Pierwszy i drugi atak $C$ zadają obrażenia. Ponieważ ostatnim trafionym atakiem jest $C$, mrówka oczekuje ataku $A$, więc ostatni atak $A$ zostaje zablokowany.

kombo([2, 2, 1])

Powyższe wywołanie zwraca $3$. Ataki w tej kombinacji to $CCB$. Wszystkie ataki zadają obrażenia.

Przykładowy program oceniający

Przykładowy program oceniający wczytuje dane wejściowe w następującym formacie, w którym $C_i$ jest napisem długości $N$ reprezentującym ukryte ataki przycisków w $i$-tym scenariuszu:

$$\begin{gathered}T\ N\ S\\C_1\\C_2\\\ldots\\C_T\end{gathered}$$

Dla każdego scenariusza wypisuje następujący wynik: jeśli scenariusz został rozwiązany poprawnie, wypisywana jest łączna liczba użytych operacji. Jeśli wystąpił błąd, wypisywany jest jeden z poniższych komunikatów błędu:

Yanlis cevap (Wrong answer)
Buton asildi (Button limit exceeded)
Yanlis buton (Invalid button)
Kombo asildi (Combo limit exceeded)
  • Yanlis cevap (Wrong answer): Wypisywany, jeśli odpowiedź dla któregokolwiek przycisku jest błędna.
  • Buton asildi (Button limit exceeded): Zwracany, jeśli w jednym wywołaniu funkcji kombo użyto więcej niż $400$ przycisków.
  • Yanlis buton (Invalid button): Zwracany, jeśli w wywołaniu funkcji kombo któryś indeks przycisku nie jest liczbą pomiędzy $0$ a $N - 1$.
  • Kombo asildi (Combo limit exceeded): Zwracany, jeśli podczas jednego wywołania funkcji olumsuz_cekirge funkcję kombo wywołano więcej niż $400$ razy.

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.