Editorial for La persona en frente
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Solución
Como las n personas están sentadas formando un círculo y n es par, cada persona tiene exactamente una persona que se encuentra en la posición diametralmente opuesta.
La persona que está en frente de k se encuentra exactamente n / 2 posiciones después de ella.
Por lo tanto, podemos calcular:
\[ j = k + \frac{n}{2} \]
Pero debemos considerar que las personas están numeradas de 1 a n. Si j > n, simplemente damos la vuelta al círculo restando n.
Una forma directa de hacerlo es:
\[ j = \begin{cases} k + \frac{n}{2} & \text{si } k \leq \frac{n}{2} \\ k - \frac{n}{2} & \text{si } k > \frac{n}{2} \end{cases} \]
Ejemplo
Para n = 6:
- Persona
1→1 + 3 = 4 - Persona
2→2 + 3 = 5 - Persona
3→3 + 3 = 6 - Persona
4→4 - 3 = 1 - Persona
5→5 - 3 = 2 - Persona
6→6 - 3 = 3
Así, por ejemplo, para n = 6, k = 3, la respuesta es 6.
Complejidad
Para cada caso solamente realizamos una suma o resta:
- Tiempo:
O(1) - Memoria:
O(1)
Código en C++
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
long long n, k;
cin >> n >> k;
long long mitad = n / 2;
if (k <= mitad)
cout << k + mitad << '\n';
else
cout << k - mitad << '\n';
}
return 0;
}
Otra forma de verlo
También podemos pensar que simplemente estamos desplazando k n/2 posiciones alrededor del círculo:
\[ \boxed{\text{frente}(k) = ((k-1+n/2)\bmod n)+1} \]
Esta fórmula también funciona directamente con la numeración de 1 a n.
Comments