Skip to Content

High Card Wins

Análisis oficial (Java) 

Intuitivamente, siempre queremos que Bessie gane con la carta más pequeña posible. Podemos asegurar este mínimo guardando las cartas disponibles de Bessie y de Elsie. Si la carta actual de Elsie es mayor que la de Bessie, pasamos a la siguiente carta más alta de Bessie.

Se puede ver el algoritmo en acción con el conjunto de prueba de abajo:

Implementación

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

#include <algorithm> #include <cstdio> #include <iostream> #include <vector> using namespace std; const int MAX_CARDS = 1e5; bool elsieHas[MAX_CARDS + 1]; int main() { freopen("highcard.in", "r", stdin); freopen("highcard.out", "w", stdout); int n; cin >> n; for (int i = 0; i < n; i++) { int card; cin >> card; elsieHas[card] = true; } vector<int> elsie; vector<int> bessie; // Como recorremos los valores en orden creciente, // las dos listas quedarán ordenadas. for (int i = 1; i <= n * 2; i++) { // Si Elsie tiene esta carta: if (elsieHas[i]) { elsie.push_back(i); } else { bessie.push_back(i); } } int points = 0, bessieIndex = 0, elsieIndex = 0; while (bessieIndex < n && elsieIndex < n) { // Si Bessie gana: if (bessie[bessieIndex] > elsie[elsieIndex]) { points++; bessieIndex++; elsieIndex++; // Si no, elegimos la siguiente carta más alta de la mano de Bessie. } else { bessieIndex++; } } cout << points; }
import sys sys.stdin = open("highcard.in", "r") sys.stdout = open("highcard.out", "w") elsie_has = set() n = int(input()) for i in range(n): elsie_has.add(int(input())) elsie, bessie = [], [] # Como recorremos los valores en orden creciente, # las dos listas quedarán ordenadas. for i in range(1, n * 2 + 1): # Si Elsie no tiene la carta: if i not in elsie_has: bessie.append(i) else: elsie.append(i) points, bessie_index, elsie_index = 0, 0, 0 while bessie_index < n and elsie_index < n: # Si Bessie gana: if bessie[bessie_index] > elsie[elsie_index]: points += 1 bessie_index += 1 elsie_index += 1 # Si no, elegimos la siguiente carta más alta de la mano de Bessie. else: bessie_index += 1 print(points)
// Código del editorial oficial de USACO: import java.io.*; import java.util.*; public class HighCard { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("highcard.in")); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("highcard.out"))); int n = Integer.parseInt(br.readLine()); boolean[] elsieOwns = new boolean[2 * n + 1]; for (int i = 0; i < n; i++) { elsieOwns[Integer.parseInt(br.readLine())] = true; } List<Integer> bessie = new ArrayList<Integer>(); List<Integer> elsie = new ArrayList<Integer>(); int points = 0; // Como recorremos los valores en orden creciente, // las dos listas quedarán ordenadas. for (int i = 1; i <= n * 2; i++) { // Si Elsie no tiene la carta: if (elsieOwns[i]) { elsie.add(i); } else { bessie.add(i); } } int bessieIndex = 0; int elsieIndex = 0; while (bessieIndex < n && elsieIndex < n) { // Si Bessie gana: if (bessie.get(bessieIndex) > elsie.get(elsieIndex)) { points++; bessieIndex++; elsieIndex++; // Si no, elegimos la siguiente carta más alta de la mano de Bessie. } else { bessieIndex++; } } pw.println(points); pw.close(); } }