Debemos probar todos los valores para la cantidad de líderes \(l\) desde \(1\) hasta \(n-1\) y verificar cuando el resto puede ser dividido en grupos con la misma cantidad de miembros (que es, \(l\) divide a \(n-l\)). El número de valores válidos para \(l\) es nuestra respuesta. Complejidad: O(n).
int n, cnt = 0;
cin >> n;
for (int i = 1; i < n; ++i) {
if ((n - i) % i) {
cnt += 1;
}
}
cout << cnt << endl;
El problema es además equivalente a encontrar la cantidad de formas que el número de miembros de un grupo divida a n sin contar cuando todos los grupos tienen un único miembro.
int n, cnt = 0;
cin >> n;
for (int i = 1; i * i <= n; ++i) {
if (n%i == 0) {
if (i*i != n) cnt += 2;
else cnt += 1;
}
}
cout << cnt - 1 << endl;
Este es un problema simple de implementación. Iteramos a traves de los tiempos en orden, recordando cuando la última palabra es tipeada, y manteniendo un contador para el número de palabras apareciendo sobre la pantalla. Incrementa el contador por 1 cuando procesas un nuevo tiempo. Cuanto la diferencia entre el tiempo de dos palabras consecutivas es mayor que c, reinicia el contador para 1.
int n, cnt = 0, last = -1;
cin >> n;
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
if (last != -1 and x - last > c) {
cnt = 0;
}
cnt += 1;
last = x;
}
cout << cnt << endl;
La mejor opción es formar grupos de dos estudiantes con un estudiante único, y luego formar grupos de tres estudiante. Debemos calcular los valores \(cnt1\) y \(cnt2\) indicando la cantidad de estudiantes en un grupo de una persona y dos personas respectivamente.
Entonces la respuesta es \(min\)(\(cnt1\), \(cnt2\) + \(\frac{(cnt1 - cnt2)}{3}\))
int n;
cin >> n;
vector<int> arr(n);
for (int& v : arr) cin >> v;
int cnt1 = count_if(arr.begin(), arr.end(), [](int x) {return x == 1;});
int cnt2 = n - cnt1;
cout << min(cnt1, cnt2 + (cnt1 - cnt2)/3) << endl;
Verificar las longitudes de s y t. Si son diferentes, s no puede convertirse en t y la respuesta es "No".
Si para todos los indices ambos s[i] y t[i] son vocales o consonantes, entonces la respuesta es "Yes", en otro caso "No"
string s, t;
cin >> s >> t;
if (s.size() != t.size()) {
cout << "No" << endl;
return 0;
}
auto isVowel = [](char x) {
return string("aeiou").find(x) != string::npos;
};
int n = s.size();
for (int i = 0; i < n; ++i) {
if (isVowel(s[i]) != isVowel(t[i])) {
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
En esto problema uno puede encontrar el minimo de todos los elementos, y encontrar el mínimo de los que són estrictamente mayores o reportar que este no existe.
cin >> n;
vector<int> a(n);
for (int& v : a) cin >> v;
int mn = *min_element(v);
int mn2 = INT_MAX;
for (int v : a) {
if (v != mn) mn2 = min(mn2, v);
}
if (mn2 == INT_MAX) cout << "NO" << endl;
else cout << mn2 << endl;
Para este problema podemos suponer que la secuencia comienza en el índice \(i\), entonces, podemos avanzar sobre los índices y verificar cúal es el máximo que cumpla, en caso que deje de cumplir en el índice j nosotros podremos descartar todo indice entre \(i\) y \(j-2\), ya que es fácil verificar que comenzando en cualquiera de estos también dejará de cumplir en el índice j. La respuesta final es el máximo rango encontrado comenzando en un índice i.
int n;
cin >> n;
vector<int> a(n);
for (int& v : a) cin >> v;
if (n == 1) return cout << 1 << endl, 0;
int ans = 2, temp = 2;
for (int i = 2; i < n; ++i) {
if (a[i] != a[i-1] + a[i-2]) {
temp = 1;
}
temp += 1;
ans = max(ans, temp);
}
cout << ans << endl;
En este problema podemos ver cada \(k\)-ciclo como \(k\) puntos consecutivos conectados por \(k-1\) segmentos, y cada movimiento como eliminar uno de dichos segmentos. Esto quiere decir que la cantidad de movimientos es constante, por tanto solo se gana si la suma de los tamaños de los ciclos menos la cantidad de ellos es una cantidad impar.
int n;
cin >> n;
vector<int> a(n);
long long winner = 0;
for (int& v : a) {
cin >> v;
winner += v-1;
if (winner%2 == 1) cout << 1 << endl;
else cout << 2 << endl;
}
Debemos calcular el array de tripletas \(t\), donde \(t_i = (sum_{i, j}, row_i, column_j)\) que representa la suma de la \(i\)-ésima fila sin la \(j\)-ésima columna, además de considerar la fila i y columna j. Las secuencias pueden ser calculadas en la siguiente manera: por cada secuencia halla su suma, entonces iterar sobre todos sus elementos y substraer cada uno independientemente de la suma. Ahora ordenamos el array t con el comparador por defecto. Finalmente la respuesta es "YES" si y solo si existe dos adjacentes elementos con igual suma y diferentes secuencias. En otro caso la respuesta es "NO".
Complejidad de ejecución de esta solución es: O(\((\sum_{i=0}^{k−1}n_i)⋅\log(\sum_{i=0}^{k−1}n_i)\)).
int k;
cin >> k;
vector<pair<int, pair<int, int>>> t;
for (int i = 1; i <= k; ++i) {
int n;
cin >> n;
vector<int> x(n);
for (int& v : x) cin >> v;
int sum = accumulate(x.begin(), x.end(), 0);
for (int j = 1; j <= n; ++j) {
t.push_back(make_pair(sum - x[j-1], make_pair(i, j)));
}
}
sort(t.begin(), t.end());
for (int i = 0; i < t.size() - 1; ++i) {
if (a[i].first == a[i+1].first and a[i].second.first != a[i+1].second.first) {
cout << "YES" << endl;
cout << a[i+1].second.first << " " << a[i+1].second.second << endl;
cout << a[i].second.first << " " << a[i].second.second << endl;
return 0;
}
}
cout << "NO" << endl;