High Card Wins
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:
#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();
}
}