Editorial for Red profesional
Submitting an official solution before solving the problem yourself is a bannable offence.
Primero algunas observaciones:
si
, y no se paga ni por
ni por
, entonces
se conecta primero que
.
Es mejor realizar primero todas las conexiones pagadas, y luego las conexiones gratis.
Por lo cual se pueden ordenar los pares de la entrada, y de este arreglo, se selecciona un subconjunto, se paga, y el resto se conecta en orden. Con esto se puede resolver el problema en lo cual es suficiente para la subtarea 1.
Al arreglo , despues de ordenado, a cada posición se le puede restar
(porque se sabe que los
elementos anteriores que el se conectarán antes que el a no ser que
sea comprado, caso en el cual no importa
) y queda como resultado la cantidad de personas
que se tienen que comprar
debido a la restricció de la persona
.
Se puede resolver ahora con el problema analizando si se compra o no cada elemento en de
a
,
significa comprando
conexiones en el sufijo
, las transiciones son comprar la persona
y moverse a
o no comprarla y moverse a
si
. Con esta
en
se pueden alcanzar la subtarea 2.
Se puede notar que al comprar el -ésimo elemento es como si se restara
a
para
, y entonces un elemento se puede comprar si
.
Además se tiene que para todo
, por lo que en el caso de que todos cuesten
la solución siempre va a ser un prefijo del arreglo (ordenado) (subtarea 3).
Debido a las observaciones que hemos hecho hasta ahora, se puede elaborar un algoritmo greedy, recorremos de
a
, manteniendo un conjunto
de las conexiones que podemos comprar, en cada paso añadimos
a
y mientras la cantidad de gente que hemos comprado es menor que
, compramos la conexión mas barata posible, la complejidad es
si se usa una priority queue o un set, la prueba de este algoritmo se deja como un corto ejercicio al lector.
Comments