Atascado en un problema de Acepta el Reto

E

https://www.aceptaelreto.com/problem/statement.php?id=384&cat=104

Pues nada, que estoy intentando resolver éste ejercicio en Java (haters a mí) y no hay huevos. O obtengo un Runtime Error, o excedo de tiempo o memoria. Se puede programar en Java, C y C++. A ver si alguno lo logra y me puede orientar xD

Un saludo

B

Te dejo mi código AC y abajo explico la idea:

spoiler
Otra versión

Básicamente, mantén dos sets de números con los números que ya has visto y los que te quedan por ver. Si el menor de los números que ya has visto es menor al máximo de los que te quedan por ver que a la vez sea menor a tu elemento actual entonces tienes un caso sin premio. Es decir:

  • v(i) = Elemento que estamos tratando
  • lowest = El elemento más pequeño del conjunto de números que ya hemos visto
  • highest = El número más grande x del conjunto de números que estan por ver que satisface x < v(i)

Si lowest < v(i), v(i) > highest y lowest < highest para algún i en [1, n-2] (contando desde el cero), entonces mínimo un triplete sin premio.

Obtener el menor de un set es O(1) y el máximo que puedes usar sin pasarte del elemento actual es O(logn) si por ejemplo usas lower_bound (C++) o floor/ceiling (Java, TreeSet)

En Java puedes usar TreeSet y las funciones floor y ceiling para hacer lo mismo que he hecho yo. Con todo esto, la complejidad debería salirte O(n log n). Si tuviera el intellij con el chelper te lo haría también en Java, pero formateé hace poco :(

Por cierto, alguien de aquí está participando en la Facebook Hacker Cup?

6 2 respuestas
HeXaN

#2 Gran respuesta así da gusto. Casi lloro al ver notación O grande.

E

#2 muchas gracias por la explicación!

Si, la idea más o menos es la que tengo, el problema es a la hora de implementarlo en Java. Como estas detectando en c++ que es final de la entrada?

1 respuesta
B

#4 el operador >> de los objetos que son como cin esta sobrecargado para devolver implícitamente un booleano en relación a si ha podido leer correctamente lo que se le pide

1 respuesta
E

#5 en Java estoy probando con el BufferedReader.readLine(), que si devuelve null es que ya no habría más entrada, pero no hay forma.

1 respuesta
B

#6 Yo para Java uso la siguiente clase para leer input:

spoiler

Y simplemente hago un try catch para saber si aun queda input:

try {
 x = in.nextInt(); // in es un inputReader
}
catch (Exception e) {
 return;
}

La clase esta la pillé de Petr Mitrichev (google, search engine), así que mal del todo no debe estar (y no lo está).

1 respuesta
E

#7 si algo así usaba, pero nada tio, sigue tirando RTE. Algo tiene mal la entrada, si no, no me lo explico

1 respuesta
B

#8 pon el código y quizá veo el bug

B

Bueno, lo estoy intentando meter en Java y viendo el límite de memoria que se impone me parece bastante complicado. Como mucho puedes deshacerte del set de los elementos ya vistos y quedarte con el mínimo, pero aun así sigue saltando MLE. Viendo que este problema es de una local de la ACM ICPC y que ahí lo mayoritario es C++ es probable que el problema no esté pensado para meterlo así.

Mi intento de solución
1 respuesta
E

#10 a ver si mañana tengo tiempo y lo intento con el scanner.

Ayer fue el concurso en mi uni y estos fueron los ejercicios: http://swerc.up.pt/2016/reports/problemset.pdf del A al G.

Menudas risas xDDDD Pero bueno, completamos dos y acabamos segundos

2 respuestas
Soulscx

Si puedes hacerlo en C pasa el mismo algoritmo a C seguramente ganes en memoria cortando de por alli o por alla en estructuras y objetos

L

#11 cuanto tiempo teníais? Porque joder 2/5 y acabar segundos... Jajaja, gracias por los ejercicios me los guardo, teníais alguna restricción de lenguajes o algo?

1 respuesta
B

#11 el scanner es muy lento, no te servira, ademas el problema es de memoria.

Si te atascas en algun problema del SWERC pregúntame porque tengo muchos hechos.

En qué universidad estudias?

1 respuesta
E

#13 nop, lenguaje el que quisiesemos. Quitando 1 grupo, que fue quien quedó primero (y solo hizo 3 ejercicios) el resto no teníamos experiencia en ningún tipo de concursos. La verdad que se sobraron con esos ejercicios v.v 5h era el tiempo

#14 ya, es lentisimo... pero bueno, lo intentaré a ver si puedo de alguna forma xD Estoy en la Rey Juan Carlos.

1 respuesta
Mewtwo

#15 Realmente en ese ejercicio te estan pidiendo un backtracking como una casa, ya que tuenes que comprobar todas las combinaciones posibles de los numeros

Al igual que tampoco puedes usar un set , ya que por definicion un set en un conjunto sacas los valores de forma aleatoria.

Y si lo haces en pascal te simplificas muchisimo la vida tanto para cojer o hacer recursividad

1 respuesta
E

#16 el problema es leer la pu** entrada en Java, no lo logro. BufferedReader tira MLE, y con Scanner no logro detener la ejecución en el EOF

2 respuestas
B

#17 con Scanner has probado con el metodo hasNext()?? con eso debería...

1 1 respuesta
Mewtwo

#17 pon el código de como le tienes por que con el BufferedReader debería servirte, ya que lees la línea lo pasas a un string , el string usas el método Split , divides en arrays etc ...

Si usas scanner con hasNextInt deberías saber cuando has terminado y usando nextInt sacas todos los números de uno a uno ...

En cuestiones de tiempo con eso no deberías tener problema, uses uno u otro.

1 respuesta
25 días después
E

#18 #19 se me olvidó completamente contestaros xD

Al final pasé de resolver el ejercicio, ya volveré a darle vueltas mas tarde. Ahora estamos con este como problema semanal: https://www.aceptaelreto.com/problem/statistics.php?id=319

https://github.com/elraro/AceptaElReto/blob/master/src/intervalo300/Problema319.java

Y nada, TLE xd

Edit: solucionado! está la solución en el github

eso si, rendimiento de -1

E

Por si os interesa, mejoré el rendimiento hasta 0,4 segundos, pero ya no he sido capaz de sacar menos xD

1 respuesta
Mewtwo

#21 la solucion del 104 no la subistes al github ?

1 respuesta
E

#22 no tengo hechos todos los ejercicios, ese ni lo vi.

E

Bueno, acabo de volver del Ada Byron http://ada-byron.es/2017/

Es la primera vez que hago un concurso de este estilo. Me ha gustado mucho, y animo a todos a que participéis en este o similares. O que organicéis uno en vuestra propia universidad! Aunque hemos quedado situados de pena, es una muy buena experiencia, lo pasas genial. El próximo año a mejorar! :)

Usuarios habituales