William and Robot
Explicación
Primero, nótese que el único requisito para una solución válida es que, para cualquier número par , William debe haber seleccionado a lo sumo enteros de entre los primeros enteros. Es imposible seleccionar más de enteros en los primeros enteros, porque el robot se habrá llevado todos los otros enteros para cuando podamos elegir el siguiente. Nótese también que es posible “guardar” elecciones, ya que se pueden elegir menos de enteros para , lo que permite elegir más para un más grande.
Por ejemplo, si tuviéramos un arreglo de tamaño , podríamos seleccionar cualquiera de los dos primeros elementos y cualquiera de los dos últimos, seleccionando exactamente enteros tanto para como para . Como alternativa, podríamos seleccionar ambos de los dos últimos elementos, seleccionando 0 enteros para y enteros para . Nótese que no podemos tomar el primero y el segundo elemento, porque el robot se lleva el que no elijamos.
Para resolver este problema, podemos iterar de a y mantener una cola de prioridad con los números seleccionados de forma tentativa por William hasta el momento. Para cada empujamos a la cola de prioridad y, si es par, extraemos el menor elemento de la cola de prioridad mientras la cantidad de enteros tomados sea mayor que .
Implementación
Complejidad temporal:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int &i : a) { cin >> i; }
// guarda los números seleccionados actualmente
priority_queue<int, vector<int>, greater<int>> taken;
for (int i = 0; i < n; ++i) {
taken.push(a[i]);
if (i & 1) taken.pop();
}
long long ans = 0;
while (!taken.empty()) {
ans += taken.top();
taken.pop();
}
cout << ans << endl;
}import java.io.*;
import java.util.*;
public class WilliamAndRobot {
public static void main(String[] args) {
Kattio io = new Kattio();
int n = io.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) { a[i] = io.nextInt(); }
PriorityQueue<Integer> taken = new PriorityQueue<>();
for (int i = 0; i < n; i++) {
taken.offer(a[i]);
if (i % 2 == 1) { taken.poll(); }
}
long ans = 0;
while (!taken.isEmpty()) { ans += taken.poll(); }
io.println(ans);
io.close();
}
// CodeSnip{Kattio}
}import heapq
n = int(input())
a = list(map(int, input().split()))
taken = []
for i in range(n):
heapq.heappush(taken, a[i])
if i % 2 == 1:
heapq.heappop(taken)
print(sum(taken))