Mehmet, un aficionado a los videojuegos, lleva 10 horas jugando a Immortal Grasshopper. Immortal Grasshopper es un videojuego en el que controlas con botones a tu personaje, un saltamontes maestro de kárate. Tu oponente es una hormiga controlada por el ordenador.
El saltamontes puede realizar un total de $S$ ($1\le S\le4$) ataques diferentes. Estos ataques se nombran con las primeras $S$ letras del alfabeto. Por ejemplo:
- $S=2$: los ataques se llaman $A,B$.
- $S=4$: los ataques se llaman $A,B,C,D$.
Cada ataque que alcanza al oponente causa 1 punto de daño.
Aunque conoces las reglas del juego, como Mehmet se ha quedado dormido tras jugar durante 10 horas, no hay nadie que te enseñe los controles. Has encontrado sobre la mesa un mando con $N$ botones (numerados del $0$ al $N-1$). Después de jugar un rato, te has dado cuenta de que cada botón puede realizar uno de los $S$ ataques diferentes, pero no sabes qué hace cada botón. Por suerte, gracias a la pegatina del primer botón, sabes que realiza un ataque de tipo $A$. Además, sabes que cada tipo de ataque diferente está asignado a al menos un botón.
Tu tarea es determinar qué tipo de ataque realiza cada botón del mando jugando a este juego.
Juegas de la manera descrita a continuación. Para atacar a la hormiga oponente, utilizas combinaciones consecutivas de botones llamadas combos. Un combo funciona así:
- Creas un combo pulsando cualquier cantidad de botones en secuencia.
- Puedes pulsar los botones en cualquier orden dentro de un combo.
- El mismo botón puede pulsarse varias veces en un combo.
- Un combo puede tener una longitud máxima de $400$.
El juego procesa tus movimientos y al final te muestra el daño total que has causado.
El daño que un combo causa a la hormiga se calcula de la siguiente forma. Sea $t(X)$ el ataque que sigue inmediatamente a $X$ en orden alfabético. Para el ataque representado por la última letra, $t(X)$ se define como el ataque $A$. Por ejemplo:
- Para $S=4$: $t(A)=B,t(B)=C,t(C)=D,t(D)=A$.
- Para $S=2$: $t(A)=B,t(B)=A$.
La hormiga oponente puede contrarrestar algunos de tus ataques mediante tácticas astutas. Más concretamente, si tu último ataque exitoso (no bloqueado) que causó daño fue $X$ y utilizas $t(X)$ como siguiente ataque, la hormiga bloqueará ese ataque $t(X)$ y no causarás daño. Si no puede bloquearlo, causarás 1 punto de daño a la hormiga (el primer ataque siempre causa daño).
Tu objetivo es averiguar e indicar los ataques de todos los botones utilizando el menor número total de combos.
Detalles de implementación
Debes implementar la función siguiente:
std::string olumsuz_cekirge(int N, int S)
- El valor $N$ representa el número de botones del mando.
- El valor $S$ representa el número de tipos de ataque diferentes del juego.
- Esta función debe devolver una cadena de longitud $N$ que represente los ataques asignados a los botones.
Para ello puedes utilizar la función kombo siguiente:
int kombo(std::vector<int> buton)
- Puedes llamar a
kombocomo máximo $400$ veces durante cada llamada aolumsuz_cekirge. - El arreglo
butonespecifica los índices de los botones que quieres utilizar en el combo. - Los valores del arreglo
butondeben ser enteros del $0$ al $N-1$. - La longitud del arreglo
butonpuede ser como máximo $400$.
Debes resolver $T$ escenarios independientes en cada prueba, con los mismos valores de $N$ y $S$. Para cada escenario independiente, se llamará una vez a olumsuz_cekirge.
Restricciones
- $1\le T\le100$
- $4\le N\le400$
- $1\le S\le4$
- El evaluador no es adaptativo. Más concretamente, la entrada se fija antes de llamar a
olumsuz_cekirgey no cambia durante las operaciones.
Subtareas
La puntuación obtenida en la subtarea $i$ será $0$ si, en algún escenario, se llama a kombo con parámetros que no cumplen los criterios anteriores o si olumsuz_cekirge devuelve un resultado incorrecto. En caso contrario, será igual a la fórmula siguiente:
$$P_i\times\min\left(1,\left(\frac{400-q}{400-Q_i}\right)^3\right)$$
- El valor $P_i$ indica la puntuación total que se puede obtener en la subtarea $i$.
- El valor $q$ indica el máximo número de llamadas a
komboentre los escenarios de todas las pruebas de la subtarea $i$. - Los valores $Q_i$ se dan en las descripciones de las subtareas.
| Subtareas | Puntos | Restricciones adicionales | Dependencias |
|---|---|---|---|
| 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$ | — |
Ejemplos
olumsuz_cekirge(6, 3)
En los ejemplos, los ataques correspondientes a los botones son, en orden, ABCBBA, por lo que esta función debe devolver esa cadena.
kombo([0, 1, 2])
La llamada anterior devuelve $2$. Los ataques de este combo serían $ABC$. El primer ataque $A$ alcanza al oponente. El ataque $B$ es bloqueado. Como el último ataque que causó daño fue $A$, la hormiga no puede bloquear el ataque $C$ y recibe daño.
kombo([0, 0, 0])
La llamada anterior devuelve $3$. Los ataques de este combo serían $AAA$. Todos los ataques $A$ causan daño.
kombo([5, 1, 3, 2, 2, 0])
La llamada anterior devuelve $3$. Los ataques de este combo serían $ABBCCA$. El primer ataque $A$ alcanza al oponente. El ataque $B$ es bloqueado. Como el último ataque que acertó sigue siendo $A$, el segundo ataque $B$ también es bloqueado. Los ataques $C$ primero y segundo causan daño. Como el último ataque que acertó es $C$, la hormiga oponente espera $A$, por lo que el ataque $A$ final es bloqueado.
kombo([2, 2, 1])
La llamada anterior devuelve $3$. Los ataques de este combo serían $CCB$. Todos los ataques causan daño.
Evaluador de ejemplo
El evaluador de ejemplo lee la entrada en el formato siguiente, donde $C_i$ es una cadena de longitud $N$ que representa los ataques secretos de los botones del escenario $i$:
$$\begin{array}{l} T\ N\ S\\ C_1\\ C_2\\ \ldots\\ C_T \end{array}$$
Imprimirá lo siguiente para cada escenario: si se resuelve correctamente, se imprime el número total de operaciones utilizadas. Si hay algún error, se imprime uno de los mensajes de error siguientes:
Yanlis cevap (Wrong answer) Buton asildi (Button limit exceeded) Yanlis buton (Invalid button) Kombo asildi (Combo limit exceeded)
Yanlis cevap(respuesta incorrecta): se imprime si hay un error en la respuesta de algún botón.Buton asildi(límite de botones excedido): se devuelve si se utilizan más de $400$ botones en una sola llamada akombo.Yanlis buton(botón no válido): se devuelve si algún índice de botón no es un número entre $0$ y $N-1$ en una llamada akombo.Kombo asildi(límite de combos excedido): se devuelve si se llama akombomás de $400$ veces durante una sola llamada aolumsuz_cekirge.