Skip to Content

Even More Odd Photos

Solución en video

Por Melody Yu

Video de YouTube (RYeYSB53dSY)

Código de la solución en video
#include <bits/stdc++.h> using namespace std; int group(int O, int E) { int diff = O - E; if (diff == 0) { return O + E; } else if (diff == 1) { return O + E - 2; } else if (diff == 2) { return E + O - 1; } else { O -= 2; E += 1; } return group(O, E); } int main() { int N; cin >> N; int oddC = 0, evenC = 0; for (int i = 0; i < N; i++) { int cow; cin >> cow; if (cow % 2 == 0) { evenC += 1; } else { oddC += 1; } } if (evenC > oddC) { cout << 2 * oddC + 1; } else { cout << group(oddC, evenC); } return 0; }
import java.io.*; import java.util.*; public class EvenMoreOddPhotos { public static int group(int O, int E) { int diff = O - E; if (diff == 0) { return O + E; } else if (diff == 1) { return O + E - 2; } else if (diff == 2) { return E + O - 1; } else { O -= 2; E += 1; } return group(O, E); } public static void main(String[] args) throws IOException { EvenMoreOddPhotos.Kattio io = new EvenMoreOddPhotos.Kattio(); int N = io.nextInt(); int oddC = 0, evenC = 0; for (int i = 0; i < N; i++) { int cow = io.nextInt(); if (cow % 2 == 0) { evenC += 1; } else { oddC += 1; } } if (evenC > oddC) { io.println(2 * oddC + 1); } else { io.println(group(oddC, evenC)); } io.close(); } // CodeSnip{Kattio} }
Pista 1

¿A FJ le importan los valores reales de las vacas?

Pista 2

¿Qué nos impide poner a cada vaca en su propio grupo y dar por terminado el problema?

Respuesta a la pista 2

Si hay demasiadas vacas pares, no habrá suficientes vacas impares para alternar entre las vacas pares, y viceversa.

Pista 3

¿Cómo deberíamos particionar las vacas si hay demasiadas vacas pares? ¿Y si hay demasiadas vacas impares?

Solución

Análisis oficial (C++) 

Explicación

En el mejor escenario, cada vaca está en su propio grupo, y la respuesta es NN. ¿Cuándo ocurre esto?

Sea OO la cantidad de vacas impares y EE la cantidad de vacas pares de la lista inicialmente. Para que cada vaca esté en su propio grupo, debemos tener E=OE = O o E=O+1E = O + 1.

En caso contrario, algunos grupos deben contener más de una vaca. Ahora el problema se divide en dos casos.

Si E>O+1E \gt O + 1, entonces hay demasiadas vacas pares. Como dos números pares suman un par, podemos tomar una vaca par como primer grupo, luego una vaca impar como siguiente grupo, y repetir esto OO veces. Las vacas restantes son todas pares, así que ponerlas todas en un solo grupo grande no causa problemas. En este caso, la respuesta es 2O+12O + 1.

En caso contrario, debemos tener E<OE < O, así que hay demasiadas vacas impares. Como dos números impares suman un par, podemos emparejar dos vacas impares, lo que equivale a tener dos vacas impares menos y una vaca par más. Repetimos este proceso de emparejar dos vacas impares hasta que EOE \ge O, momento en el cual podemos usar la lógica del primer caso para calcular la respuesta.

Implementación

Complejidad temporal: O(N)\mathcal{O}(N)

import java.io.*; import java.util.*; public class OddPhotos { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int odd = 0; int even = 0; int n = Integer.parseInt(in.readLine()); StringTokenizer cowST = new StringTokenizer(in.readLine()); for (int i = 0; i < n; i++) { int cow = Integer.parseInt(cowST.nextToken()); if (cow % 2 == 0) { even++; } else { odd++; } } // Emparejar vacas impares para que no haya demasiadas. while (odd > even) { odd = odd - 2; // Dos vacas impares juntas equivalen a una vaca par. even++; } // Agrupar vacas pares para que tampoco haya demasiadas pares. if (even > odd + 1) { even = odd + 1; } System.out.println(even + odd); } }
n = int(input()) even, odd = 0, 0 cows = [int(i) for i in input().split()] for c in cows: if c % 2 == 0: even += 1 else: odd += 1 # Emparejar vacas impares para que no haya demasiadas. while odd > even: odd -= 2 # Dos vacas impares juntas equivalen a una vaca par. even += 1 # Agrupar vacas pares para que tampoco haya demasiadas pares. if even > odd + 1: even = odd + 1 print(even + odd)
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; int even = 0; int odd = 0; for (int i = 0; i < n; i++) { int cow; cin >> cow; if (cow % 2 == 0) { even++; } else { odd++; } } // Emparejar vacas impares para que no haya demasiadas. while (odd > even) { odd = odd - 2; // Dos vacas impares juntas equivalen a una vaca par. even++; } // Agrupar vacas pares para que tampoco haya demasiadas pares. if (even > odd + 1) { even = odd + 1; } cout << odd + even << endl; }