Título: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 03:18 am Bueno, esta zona esta un poco muerta por lo tanto no cuesta nada tratar de revivirla.
Tomando las mismas reglas que la del pasado post de retos de Python que se hizo en esta zona haremos uno en C/C++. Reglas: 1) Se empezara con un ejercicio, quien lo resuelva propone otro ejercicio y asi seguimos. 2) Los ejercicios tendran un tiempo de vida de 3 dias, si en exactamente 3 dias alguien no publica una solucion alguien podra proponer otro ejercicio. 3) No publicar para decir cosas que no tengan que ver con la solucion al reto o para postear un nuevo reto. 4) Numerar los retos (Ej. Reto#1) Bueno ya que yo postee, seria de mala educacion dejar que otro ponga el reto. Reto#1: Realizar un programa que reciba un numero como argumento y diga si es primo o no. PData: No estoy estudiando C/C++ actualmente en la universidad... (Para los que diran que es una tarea.) Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 03:28 am Se me paso lo de la entrada por argumento XD
Editado... Código Reto #2 Realiza un programa que dado un numero n te imprima todas las posibles permutaciones del conjunto 1 a n ordenadas de menor a mayor. Ejemplo 1: Entrada Código: 3 Salida Código: 1 2 3 Ejemplo 2: Entrada Código: 4 Salida Código: 1 2 3 4 Título: Re: Retos C/C++ Publicado por: Leyer en 19 Agosto 2010, 05:31 am Código
Reto #3 No me critiquen por lo fácil jaja XDDDD Generar esta matriz para un entero N dado: si se ingresa 4 1 0 0 0 0 1 2 0 0 0 1 2 3 0 0 1 2 3 4 0 Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 06:09 am Código
Reto #4 Dadas las denominaciones de monedas que tienen disponibles y una cantidad de dinero que tienen que dar de cambio con esas denominaciones de monedas (supongan que tienen una infinidad de monedas de cada denominacion y que siempre tienen monedas de $1) escriban un programa que regrese la cantidad MINIMA de monedas necesarias para regresar ese cambio, por ejemplo: {$1, $2, $5} y cambio de $9 la cantidad minima de monedas es 3 ($5 + $2 + $2 = $9) {$1, $5, $7} y cambio de $10 la cantidad minima de monedas es 2 ($5 + $5 = $10) por cierto, te puedo pedir el cambio de $3000 xD una ves que hagan este problema, muchos se darán cuenta de lo hermosa que es la resolución que le da nuestro cerebro a las cosas. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 07:16 am Código
Reto#5 Dado un numero, encontrar todos los numeros perfectos inferiores a este. Título: Re: Retos C/C++ Publicado por: leogtz en 19 Agosto 2010, 07:44 am Código
Reto: Recorrer una matriz bidimensional con un puntero, con recorrer me refiero a mostrar cada uno de sus valores, no me refiero a indexación, sino a mostrar los valores usando aritmética de punteros. Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 07:54 am no han resuelto el reto #4 XD
por ejemplo yo te digo que las monedas que puedes dar son $1, $5 y $7, haora dime cual es la minima cantidad de monedas para completar la cantidad de 25$ Ejemplo1: Entrada Código: 3 Salida Código: 5 Ejemplo2: Entrada Código: 1 Salida Código: 25 el primer entero es el numero de denominaciones seguidas de n enteros que son los valores de las denominaciones y después el precio. devuelves simplemente el mínimo de monedas para lograr el precio. PD: es mas complejo de lo que parece, son esos problemas en los que te tienes que estar un par de horas pensando... Título: Re: Retos C/C++ Publicado por: leogtz en 19 Agosto 2010, 08:11 am PD: es mas complejo de lo que parece, son esos problemas en los que te tienes que estar un par de horas pensando... Sí, jaja, es por eso que aún no respondemos :p Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 08:16 am @Og.:Ni idea de que quieres en realidad, querias ver la cantidad minima de monedas para dar cambio y eso es que realiza el programa... ahora creo que estas re-planteando el problema variandolo.
Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 08:22 am @Og.:Ni idea de que quieres en realidad, querias ver la cantidad minima de monedas para dar cambio y eso es que realiza el programa... ahora creo que estas re-planteando el problema variandolo. Tal ves me di a malentender. En si no seria un reto si se usara el sistema de monedas que usamos cotidianamente, por que simplemente vas quitando la mayor denominación hasta que no puedas mas y empezar con la siguiente y asi sucesivamente, por eso lo del cambio de denominaciones.limitare un poco el problema, supondríamos que solo existen tres tipos de moneda: un peso, 5 pesos y 7 pesos nada mas. ahora has el mismo problema y veras por que empieza a agarrar complejidad XD el problema sera solo saber cual es el mínimo de monedas para llegar a un numero. Bueno, con el de Leo: Código
te refieres a algo asi? Título: Re: Retos C/C++ Publicado por: leogtz en 19 Agosto 2010, 08:52 am Sí, así es.
La idea es poner problemas sencillitos e ir aumentando la dificultad. Saludos. Título: Re: Retos C/C++ Publicado por: Oblivi0n en 19 Agosto 2010, 10:43 am Buenas, yo me apunto a los retos, alguien puede decirme cuales estan resueltos y cuales no? (aunque los acabaré haciendo todos xD)
Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 14:38 pm @guru6: las reglas...
@Og.: Te falto dejar el proximo reto. Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 15:15 pm Para el de las monedas, el problema surge en que el algoritmo greedy de ir cogiendo siempre las monedas más grandes no minimiza la cantidad de monedas, como se puede ver en el primer ejemplo que se ha puesto.
Una posible solución correcta pero muy ineficiente sería un backtracking probando todas las posibles maneras. Una forma mejor, que dejo a continuación, sería usando programación dinámica, quedando entonces una complejidad polinómica, en concreto O(np), donde n es el número de monedas y p la cantidad. Quizá me haya equivocado en algo, pero creo que es correcto. Código
Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 15:18 pm @ghastlyX Bien!!
Te toca dejarnos un reto. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 15:23 pm Og. coloca el reto#6, al parecer esta de acuerdo con la respuesta... numeralo y plantealo debajo de tu respuesta al de LeoGutierrez.
Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 15:36 pm Mejor lo pongo como nuevo Post, después podrían haber confusiones.
Reto #7 Este estara simple. Dado un numero N devuelve un numero K tal que K! tenga N 0's al final y K sea el menor posible. Ejemplo1 Entrada Código: 1 Salida Código: 5 Ejemplo2 Entrada Código: 2 Salida Código: 10 PD: N puede ser de hasta 109 Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 16:24 pm A ver, está claro que hay que contar el número de parejas de factores 5 y 2 y como hay más doses que cincos, basta con contar los cincos si no me equivoco. De esta forma, dado un cierto K, para saber cuántos ceros tendrá K!, habrá que contar cuántas veces aparece cada una de las potencias de 5 si no me equivoco. Así, haciendo binaria sobre el resultado, me queda esto, aunque puede que haya algún error en el razonamiento.
Código
Título: Re: Retos C/C++ Publicado por: [D4N93R] en 19 Agosto 2010, 16:52 pm Código
Sin comprobar ni nada xD para qué? todo factorial de K va atener mínimo N ceros al final xD Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 17:06 pm Pero te pide el menor K que cumpla eso y tu programa no devuelve el menor. Si la entrada es N = 6, tu programa devuelve 30 cuando el menor es 25.
Título: Re: Retos C/C++ Publicado por: [D4N93R] en 19 Agosto 2010, 17:13 pm Seee lo sé xD era joda, ghastlyX te toca poner reto, no te hagas el loco, no leiste las reglas? xD
Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 17:15 pm Si es correcta mi solución pongo el siguiente, pero la he pensado rápido y quizá haya algún error. A ver que dice Og.
Título: Re: Retos C/C++ Publicado por: Og. en 19 Agosto 2010, 17:18 pm @ghastlyX Correcto!! XD
les dije que sera simple hehe Te toca poner reto :D Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 17:22 pm Pues os dejo el que he preparado mientras por si estaba bien.
Reto 8: Se tiene un corral con gallos y gallinas, de tal forma que entre todos suman N animales (no necesariamente hay N/2 de cada, de hecho no tiene porque ser N par) y los animales están numerados de 0 a N - 1, pero no se sabe qué número pertenece a cada animal. Buscando entre los papeles del anterior dueño, se encuentran unos registros de apareamiento entre los animales, en forma A B, donde A y B son números entre 0 y N - 1 que indican que los animales A y B se aparearon (no se especifica cuál es el macho y cuál la hembra). Ahora el problema es ver si los registros encontrados son consistentes o no, es decir, si existe alguna manera de numerar los animales para que se puedan cumplir. Nótese que los gallos no se aparean entre ellos y lo mismo se aplica a las gallinas. Entrada: Dos números N y M, donde M será el número de registros existentes. A continuación, M líneas con dos números cada una indicando un registro de apareamiento. Salida: Si los datos son consistentes, se deberá escribir "Si", en caso contrario, "No". Restricciones (para que no se hagan backtrackings más que nada): 3 <= N <= 10000, 0 <= M <= 100000. Ejemplos: Entrada 1: Citar 3 2 0 1 1 2 Salida 1: Citar Si Entrada 2: Citar 3 3 0 1 1 2 2 0 Salida 2: Citar No Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 18:57 pm No estoy muy seguro... espero confirmacion de GhastlyX.
Los resultados coinciden con sus ejemplos. Código
Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 19:41 pm ¿Dónde lees en tu código la cantidad de animales (N)? Por lo que veo estás suponiendo que N = 3 como en los dos ejemplos que he puesto, pero como dice el enunciado, 3 <= N <= 10000. Es decir, la cantidad de animales también es un parámetro de la entrada, no sólo los registros.
Edito: Veo que tal y como lo haces no depende de la N, voy a ver si es correcto y te digo algo. Revisado, no es correcto, te dejo un contraejemplo: Citar 4 4 0 1 2 3 0 2 1 3 Tu programa dice que no son consistentes pero sí lo son. Por ejemplo, si 0 y 3 son gallos y 1 y 2 gallinas, todo cuadra. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 19 Agosto 2010, 20:12 pm ¿Dónde lees en tu código la cantidad de animales (N)? Por lo que veo estás suponiendo que N = 3 como en los dos ejemplos que he puesto, pero como dice el enunciado, 3 <= N <= 10000. Es decir, la cantidad de animales también es un parámetro de la entrada, no sólo los registros. Edito: Veo que tal y como lo haces no depende de la N, voy a ver si es correcto y te digo algo. Revisado, no es correcto, te dejo un contraejemplo: Citar 4 4 0 1 2 3 0 2 1 3 Tu programa dice que no son consistentes pero sí lo son. Por ejemplo, si 0 y 3 son gallos y 1 y 2 gallinas, todo cuadra. Dice que es inconsistente por el Código: 4 4 Edito: Estas en lo cierto... tiene un error incluso excluyendo el error aparente del [4 4]. Título: Re: Retos C/C++ Publicado por: ghastlyX en 19 Agosto 2010, 20:30 pm He puesto el caso siguiendo el formato de entrada como había dicho antes, lo que tu programa no lo sigue y cuando lo he evaluado en él ya lo he cambiado consecuentemente. A tu programa se lo he pasado así:
Citar 4 Es decir, le he dicho que hay cuatro registros y se los he puesto y dice que no son consistentes mientras que sí lo son. El 4 4 que tú decías si te fijas en el formato de la entrada en el enunciado, quiere decir que hay 4 animales y 4 registros, que se dan a continuación.0 1 2 3 0 2 1 3 Edito: No había visto tu modificación. Y como te decía, lo del 4 4 no es un error, es la primera línea de la entrada. Fíjate en el enunciado del problema en el apartado de entrada. Título: Re: Retos C/C++ Publicado por: cgvwzq en 20 Agosto 2010, 00:14 am Bueno, aunque no es eficiente creo que la idea no es mala del todo. Solo he hecho las dos pruebas del enunciado y funciona bien, pero ya me dirás si he hecho algún disparate.
El caso es que los valores de 'N' y 'M' se pasan por argumento, y se van pidiendo las 'M' 2-tuplas de parejas, en el momento en que una viole el "tratado de nogays" se muestra el 'No'. Si el final es consistente mostrará el 'Si'. De cualquier forma podría mostrar el 'No' al final, eso es facilmente modificable... Código
^^ Título: Re: Retos C/C++ Publicado por: ghastlyX en 20 Agosto 2010, 01:51 am He mirado tu código y si lo he entendido bien, creas una matriz de adyacencia con máscaras de bits y cada vez que se añade una arista miras si hay un nodo intermedio que forme un camino alternativo entre ambos nodos, lo que conforma un ciclo de longitud 3 y por lo tanto una situación inconsistente.
Suponiendo que sea eso lo que estás haciendo (en caso contrario dímelo), la solución no es correcta puesto que aunque ese es un caso no consistente claramente, hay más casos "malos" que no detectas, por ejemplo, si tenemos cinco animales que formen con las relaciones un pentágono (un ciclo de longitud cinco). El problema como bien has enfocado, se reduce a transformar la información en un grafo y decidir si el grafo es de un cierto tipo o no (sabiendo cómo, claro). Si veo que sigue sin salir, daré más pistas. Título: Re: Retos C/C++ Publicado por: Og. en 20 Agosto 2010, 02:00 am Buen problema. Así si son divertidos.
Código
Título: Re: Retos C/C++ Publicado por: ghastlyX en 20 Agosto 2010, 02:19 am Parece correcto mirando el código por encima y probando algunos casos. La idea era ver que el problema se puede convertir en un grafo donde los animales son los nodos y las relaciones entre ellos las aristas. Una vez hecho esto, la cuestión era ver si este grafo era bipartido o no (si se pueden partir los nodos en dos grupos tal que cada grupo no tenga aristas entre ellos, que serán los machos y las hembras).
Es fácil de demostrar y ver que si G = (V,E) es un grafo no dirigido, los siguientes enunciados son equivalentes: 1) G es bipartido. 2) G es bicoloreable (2-coloreable). 3) G no contiene ningún ciclo simple de longitud impar. Como las tres son equivalentes, se puede mirar cualquiera de ellas y la más eficiente de comprobar es la segunda, que mirando tú código supongo que es lo que haces. Os dejo también la solución que había preparado: Código
PD: Cuidado con las salidas, tu código imprime SI y NO en vez de Si y No. A mí me da igual, pero si eres olímpico como supongo por tu firma, ves con cuidado con estas cosas en los concursos, puesto que el juez automático te daría un WA y estos errores tontos en pleno concurso pueden costar de encontrar, pensando que es problema en el código o el razonamiento. Edito: Se me olvidaba, dos cosas: - Para saber si un grafo es bicoloreable basta con ir asignando a cada nodo libre un color cualquiera y a sus vecinos el contrario. Si se encuentra algún vecino con el mismo color es que no es bicoloreable. - Pon el siguiente reto xDD Título: Re: Retos C/C++ Publicado por: Og. en 20 Agosto 2010, 03:30 am jeje, a un amigo le paso que no le contaron los casos por un \n de mas al final del programa xD
Reto #9 Recibes don enteros (X, Y) los cuales representan una caja y tu quieres partir esa caja en cuadrados exactos. hacer un programa que te diga el mínimo numero de cuadrados exactos dentro de una caja. Ejemplo1 Entrada Código: 3 5 Salida Código: 4 1 caja de 3*3 1 caja de 2*2 2 cajas de 1*1 Ejemplo2 Entrada Código: 5 6 Salida Código: 5 2 cajas de 3*3 3 cajas de 2*2 Título: Re: Retos C/C++ Publicado por: ghastlyX en 20 Agosto 2010, 15:35 pm Supongo que sería así:
Código
A ver si la gente le pierde un poco el miedo a las dinámicas! Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 20 Agosto 2010, 21:08 pm GhastlyX deja el proximo reto... :xD sin mucho chackra
Título: Re: Retos C/C++ Publicado por: ghastlyX en 21 Agosto 2010, 06:15 am Reto #10
Una compañía de autobuses sospecha que en una de sus rutas el autobús va demasiado lleno y están estudiando poner otro más para mejorar el servicio. Para ello, han colocado un contador en las puertas que registra en cada parada cuánto varía la cantidad de personas en el bus (este número podrá ser obviamente negativo). En un cierto momento de la ruta, el conductor activa el contador y se generan los registros y más tarde lo apaga (nótese que esto implica que la suma de las diferencias podrá ser negativa, puesto que podía haber gente dentro del bus). La compañía estudiará después las sumas de subsecuencias consecutivas de la secuencia de registros. Por ejemplo, si la secuencia es -20 -15 30 -15 30, subsecuencias consecutivas son entre otras -15 30, 30 o incluso la propia secuencia completa. Entrada: Un número N <= 1000 en una línea. En la siguiente línea, N números indicando registros. Se cumple que los números de los registros serán menores en valor absoluto que 100. Salida: Escribe la mayor suma que pueda obtenerse de una subsecuencia consecutiva. Ejemplos: Entrada 1: Código: 4 Salida 1: Código: 10 Entrada 2: Código: 5 Salida 2: Código: 45 Notas: - El hecho de que la N pueda ser hasta 1000 implica que una solución trivial de complejidad O(N3) no sirve (es decir, para cada posible inicio y posible final [dos fors anidados], hacer un for más anidado para calcular la suma y quedarse con la mayor). Si alguien no tiene claro si su solución es suficiente rápida (teniendo claro al menos que es correcta), se puede generar 1000 números enteros y ver cómo de rápido es su código. Debería tardar menos de un segundo, si tarda más que eso, el algoritmo no es suficiente bueno (no consiste en optimizar el código). - Espero una solución de complejidad O(N2) intencionadamente para intentar que el problema sea más sencillo. Este problema se puede solucionar de forma más eficiente, usando una estrategia Divide&Conquer que deja una complejidad de O(NlogN) o incluso una forma ingeniosa para obtener un algoritmo O(N). Si alguien hace algún algoritmo mejor que cuadrático, como los que comento, obviamente el código será correcto. Título: Re: Retos C/C++ Publicado por: cgvwzq en 21 Agosto 2010, 15:05 pm Solución trivial O(N³):
Código
Solución mejorada, en lugar de sumar cada vez todos los intervalos usamos los datos ya calculados para obtener el nuevo resultado. ¿Es O(N²)? Código
Una mejora clara sería reservar menos espacio, ya que estoy usando tan solo media matriz... Título: Re: Retos C/C++ Publicado por: ghastlyX en 21 Agosto 2010, 15:35 pm No es la solución cuadrática estándar pero también es cuadrática y correcta, por lo tanto perfecta. En tu solución usas programación dinámica por lo que veo para calcular sec(i,j), que representa la suma de i + 1 elementos acabando en j si lo he entendido bien.
La solución cuadrática estándar usa un solo vector que guarda las sumas acumuladas, dejo el código: Código
La solución lineal que comenté, es decir, O(N), además no requiere espacio en memoria extra. Aunque el código es muy simple, la idea puede costar un poco más de ver, pero si alguien se lo mira con invariantes puede ver que es correcto. Código
Pon el siguiente reto cuando quieras. Título: Re: Retos C/C++ Publicado por: cgvwzq en 21 Agosto 2010, 21:38 pm @ghastlyX, la solución lineal es mu chulaa...XD
El programa generará una matriz "sopa de letras" de N x M, usando una función random. A la vez se le pasará una palabra que buscará en la sopa. - Las letras de la palabra deberán aparecer en orden consecutivo. Podrán estar en horizontal, vertical, diagonal y en orden inverso. - La sopa de letras contendrá solo minusculas. - Una vez se encuentra la palabra la búsqueda termina aunque pueda estar repetida (simplifica el problema) Al finalizar la búsqueda, se imprimirá la sopa de letras con la palabra en mayúsculas (si es que ha sido encontrada), y un mensaje ("Si" o "No") en función de si ha habido éxito. Entrada: Código: 5 5 pi Salida: Código: r v x i l Entrada: Código: 5 5 zas Salida: Código: i v t x u Es bastante sencillo, pero nunca me he planteado un problema de estos, y esto es lo primero que se me ha ocurrido... Título: Re: Retos C/C++ Publicado por: ghastlyX en 22 Agosto 2010, 16:01 pm Código
Para el próximo, ¿queréis algo simple o para pensar un poco? Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 22 Agosto 2010, 16:02 pm :xD no tan simple pero que no rompa craneos.
Título: Re: Retos C/C++ Publicado por: ghastlyX en 22 Agosto 2010, 16:35 pm Pues pongo uno que es bastante conocido pero que es interesante si no se conoce.
Reto #12 Año 2546, un ladrón quiere cometer una serie de robos en tiendas. Concretamente, hay N tiendas y para cada una, tras una exitosa tarea de investigación, sabe en qué intervalo de tiempo no hay vigilancia (y podrá cometer el robo). Nuestro ladrón puede teletransportarse de un sitio a otro de forma instantánea (los coches son cosa del pasado), pero sólo robará una tienda si puede dedicar el intervalo completo sin vigilancia a robarla. Por ejemplo, si tenemos dos tiendas con intervalos [100, 200] y [200, 300], podrá robar las dos (recordemos que se puede teletransportar), pero si fueran [100, 200] y [199, 300] sólo podría robar una de las dos. Entrada: Un número N <= 1000, seguido de N líneas. En cada una de estas líneas habrá dos números X Y, indicando que la tienda i-ésima no tiene vigilancia en ese intervalo de tiempo. Se cumplirá que 0 <= X,Y <= 109. Salida: El máximo número de tiendas que podrá robar. Ejemplo: Entrada: Código: 5 Salida: Código: 3 Nota: Por las restricciones que he puesto, se acepta una solución O(N2), que se puede lograr haciendo una dinámica muy sencilla. Este problema de los intervalos es conocido como típico problema greedy, pues existe una solución greedy O(NlogN). Título: Re: Retos C/C++ Publicado por: Dznp en 22 Agosto 2010, 16:56 pm :xD no tan simple pero que no rompa craneos. 3) No publicar para decir cosas que no tengan que ver con la solucion al reto o para postear un nuevo reto. Es gracioso... Porque hace 3 dias me dijiste exactamente lo mismo por poner una respuesta que no tenga que ver con un reto. Me parece que te crees capas de hacer lo que quieras por ser el creador, pero si pones reglas cumplilas vos también ;) Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 22 Agosto 2010, 17:16 pm :xD no tan simple pero que no rompa craneos. 3) No publicar para decir cosas que no tengan que ver con la solucion al reto o para postear un nuevo reto. Es gracioso... Porque hace 3 dias me dijiste exactamente lo mismo por poner una respuesta que no tenga que ver con un reto. Me parece que te crees capas de hacer lo que quieras por ser el creador, pero si pones reglas cumplilas vos también ;) Si te fijas el hizo una pregunta... es de mala educacion no contestarla. Título: Re: Retos C/C++ Publicado por: ghastlyX en 23 Agosto 2010, 22:46 pm Como veo que no hay soluciones, os digo el nombre del problema que os he puesto, que como ya dije es bastante conocido como típico problema greedy, a ver si así aparece alguna solución. El problema se conoce como Activity selection problem.
Título: Re: Retos C/C++ Publicado por: ghastlyX en 25 Agosto 2010, 16:35 pm Han pasado tres días y no hay soluciones, así que explico como se resuelve (aunque si se buscaba en Google el nombre del problema tal y como dije, explica en muchos sitios diferentes la solución).
La solución más eficiente es un algoritmo greedy que consiste en ordenar los intervalos por hora de final. Una vez hecho esto, se coge el primero y se va cogiendo el siguiente que no solape con el último cogido. Código
El último for de este algoritmo es lineal, por lo que la complejidad se ve dominada por el coste de ordenar, que usando un algoritmo eficiente como por ejemplo Merge Sort deja una complejidad de O(NlogN). Otra solución menos eficiente pero válida con las restricciones que puse es la dinámica cuadrática que se puede hacer en función de la N, que tiene complejidad O(N2). Código
La idea de la dinámica es que M[ i] representa el máximo número de intervalos que puedo coger usando el i-ésimo en último lugar. Como están ordenados los intervalos por inicio (en el otro se ordenaba por final), el algoritmo planteado es correcto. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 25 Agosto 2010, 18:15 pm :xD bueno GhastlyX coloca otro reto, :xD pero que no sea tan fuerte...
Título: Re: Retos C/C++ Publicado por: ghastlyX en 25 Agosto 2010, 18:21 pm Según las normas tras tres días cualquiera puede poner otro reto, mejor que lo ponga otro, que yo puse este último con intención de que fuera muy sencillo...
Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 25 Agosto 2010, 18:32 pm Reto#13 Considerese el siguiente algoritmo:
Código: 1. input n tomando la entrada 7 la siguiente secuencia es imprimida: Código: 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 La entrada: Consiste en un par de enteros 'i' y 'j', los enteros deben estar comprendidos entre 0<=x<=1,000,000 El Problema: Determinar el ciclo mas largo entre 'i' y 'j'. La salida: Se colocara en pantalla el valor de 'i', 'j' y el valor del mayor ciclo entre los valores de 'i' y 'j' Ejemplo: Entrada: Código: 1 10 Código: 1 10 20 Título: Re: Retos C/C++ Publicado por: [D4N93R] en 27 Agosto 2010, 01:14 am Bueno, por ahora no toy seguro si es la mejor forma de hacerlo, sigo trbajando en ello, se que hay otras formas, pero no logro hacerlo aún ya que tengo unos pequeños problemas con sequences y mutable types.
F# Código
EDIT: PD: Se que la idea es hacerlo en C++, pero es que no tengo más nada que hacer :) EDIT 2: Coloco 2 formas más de hacerlo siguiendo el mismo algoritmo, solo lo hago para aprender F# más nada. Nota: ghastlyX, estoy pensando en lo que me dijiste, un saludo! Título: Re: Retos C/C++ Publicado por: ghastlyX en 27 Agosto 2010, 02:38 am No entiendo del todo el código porque no conozco el lenguaje, pero por lo que veo vas de uno en uno dentro del rango y vas haciendo el algoritmo hasta acabar. Hay una manera de hacerlo mucho más rápido.
Como pista, intenta no calcular los pasos para ningún número más de una sola vez ;) Título: Re: Retos C/C++ Publicado por: [D4N93R] en 27 Agosto 2010, 02:51 am ghastlyX, dices que hay una manera más rápido de hacerlo, no lo comprendo ya que como se si para un número que aún no he calculado cuál va a ser el resultado?
Es decir, si es un rango [1..10] para que comprobar si ya lo hice con 7 por ejemplo, si se que solo va a salir una sola vez. A menos de que haya entendido mal :D Título: Re: Retos C/C++ Publicado por: ghastlyX en 27 Agosto 2010, 02:56 am Si tu intervalo es el [1, 10], por ejemplo cuando mires el 3 pasarás por el 10, que luego volverás a calcular cuando llegues al 10. Lo que comentaba era evitar estas repeticiones de cálculos, puesto que si el intervalo es grande (según el enunciado los números del intervalo pueden llegar a 1000000), la diferencia es notoria.
Título: Re: Retos C/C++ Publicado por: [D4N93R] en 27 Agosto 2010, 03:02 am Ah ok!! ya lo pillo xD :P vale.. a ver si me sale xD que eso complica un poco las cosas!
Y tienes razón, eso podría mejorar mucho el performance del código. EDIT: ghastlyX la única forma que se me ocurre de hacerlo como tu dices creo que va a ser muy lenta. Ni idea.. xD Título: Re: Retos C/C++ Publicado por: ghastlyX en 27 Agosto 2010, 03:20 am La gracia es que sea más rápido, si no mal vamos. Simplemente guarda lo que hayas calculado una vez. Cada vez que pases por un número, antes de calcularlo mira si ya está hecho.
Título: Re: Retos C/C++ Publicado por: [D4N93R] en 27 Agosto 2010, 03:44 am Justamente eso había hecho, pero no se, en casos donde esté iterando números muy grandes, tengo que revisar una lista en cada giro. Tengo que hacerle pruebas de rendimiento a ver que tal.
Saludos! Título: Re: Retos C/C++ Publicado por: ghastlyX en 27 Agosto 2010, 03:58 am Si tienes que consultar una lista es muy lento, la idea es usar un vector, para, por ejemplo, el primer millón de números. Obviamente se pasará de ese límite calculando ciertos números, para esos simplemente si ocurre repetiré los cálculos, puesto que no tenemos memoria infinita. Así al menos el intervalo completo [1, 1000000] lo hace de forma instantánea el siguiente programa (aunque repita cálculos si sale del rango):
Código
De hecho esto sería una manera de resolver el problema usando memoization. Para poder guardar todos los valores, ya que un vector no se puede usar (demasiada memoria) y una lista como tú decías es demasiado lenta (hay que recorrerla entera en el peor caso, coste lineal), la mejor manera que se me ocurre es usar un árbol binario balanceado que permita consultar si está calculado (y su valor) en tiempo logarítmico. Estos están implementados en los contenedores map de la STL de C++. En este problema en concreto no sé qué sería más rápido, si guardar todo con maps aumentando el coste de cada consulta o bien hacer cada consulta instántanea consultando un vector a costa de repetir los cálculos de números fuera del rango del vector. Título: Re: Retos C/C++ Publicado por: [D4N93R] en 27 Agosto 2010, 04:14 am Si exacto, ese es el problema, yo pensé usar un binarytree pero no sabes la flojera que me dió. :/
Hice las dos pruebas, con vector y con list. Obviamente Vector es mucho más rápido en grandes intervalos. En pequeños no se nota la diferencia entre ambos. Un saludo! Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 27 Agosto 2010, 04:28 am :xD GhastlyX publicaste la respuesta... pon el proximo reto.
Título: Re: Retos C/C++ Publicado por: ghastlyX en 27 Agosto 2010, 04:50 am Reto #14
Como aún no he mirado los de este año, os dejo uno de la IOI del año pasado, a mi opinión, el más fácil de todos y con diferencia. Es bastante asequible. http://www.ioi2009.org/GetResource?id=1271 Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 1 Septiembre 2010, 03:21 am :xD 5 dias y sin respuestas... alguien se propone poner algun reto?
Título: Re: Retos C/C++ Publicado por: OwNet en 1 Septiembre 2010, 21:37 pm mi solucion va quedando asi algun pequeno error que lo corrijo esta noche o alguien de ustedes corrijalo es que estoy de salida :)
Código: #include <cstdio> Título: Re: Retos C/C++ Publicado por: OwNet en 2 Septiembre 2010, 07:13 am Bueno ya lo tengo resuelto les dejo el codigo
Código: #include <cstdio> Reto #15 Dado un conjunto de mujeres en las cuales en cada una de ellas se representa su belleza, elegancia y educacion. Si dentro de este mismo conjunto una de ellas encuentra que alguien es mas bella mas elegante y mas culta que ella. Ella optara por suicidarse . Entrada El primer dato de entrada sera el numero de mujeres que se analizaran las siguientes n lineas seran descritas cada una por los tres atributos antes mencionados belleza elegancia y educacion Salida La salida sera el numero de suicidios que ocurriran tomando en cuenta los datos anteriores por ejemplo Entrada Código: 5 Salida Código: 2 Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 2 Septiembre 2010, 19:25 pm Aqui esta el codigo... voy a comer, traigo el reto en aproximadamente 1 hora.
Código
Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 3 Septiembre 2010, 00:11 am Reto #16: Un bloque de masa M, inicialmente en reposo, se jala hacia la derecha a lo largo de una superficie horizontal mediante una fuerza horizontal constante F. Este se mueve una distancia(metros) D sobre una superficie con un coeficiente de friccion N. El resultado debe de ser la velocidad final del bloque exactamente al recorrer esa distancia.
Código: Entradas: Título: Re: Retos C/C++ Publicado por: carlitos_jajajajaja en 9 Septiembre 2010, 07:20 am Resuelto...
Código
Reto #17 Generar aleatoriamente 2 numeros enteros de 30 cifras y mostrar el resultado exacto de su suma Título: Re: Retos C/C++ Publicado por: Komodo en 9 Septiembre 2010, 09:15 am Un entero no puede tener tantas cifras....
Título: Re: Retos C/C++ Publicado por: Novlucker en 9 Septiembre 2010, 14:45 pm Creo que ese es el reto :rolleyes:
Saludos Título: Re: Retos C/C++ Publicado por: ace332 en 11 Septiembre 2010, 13:59 pm Creo que ya la tengo! ;D
Código: #include <stdio.h> Reto #18 (Otro que tiene que ver con números grandes): Calcular el factorial de un número n, 0<=n<=100. Sin usar tipos de datos de punto flotante (float, double, etc). Y para los que puedan pensar que es una tarea, pues no, no lo es. :P :¬¬ Título: Re: Retos C/C++ Publicado por: Og. en 13 Septiembre 2010, 07:30 am Regrese XD
Código
Reto #19 Escalando la piramide supon que hay una piramide, y quieres saber cual es la cantidad maxima de piedras que puedes recolectar subiendo directamente a la sima. Entrada un numero N que dice el numero de pisos en la piramide. N lineas con el numero de piedras que hay en cada punto de la piramide. el ultimo piso de la piramide siempre sera de 1 solo bloque, el penultimo de 2 , el ante penultimo de 3 y asi hasta llegar al piso Salida Un entero que indique el numero maximo de piedras que se puedan juntar. Ejemplo Código: 3 esos datos se deben interpretar asi: (http://i.elhacker.net/i?i=TrfYV238RD0GdUsaYTgSY2Vo) (http://i.elhacker.net/d?i=TrfYV238RD0GdUsaYTgSY2Vo) Salida Código: 4 Título: Re: Retos C/C++ Publicado por: ace332 en 13 Septiembre 2010, 19:32 pm disculpame compañero pero me parece que no leiste bien el enunciado del problema :o:
Citar Calcular el factorial de un número n, 0<=n<=100 El programa que pusiste sólo calcula bien hasta el factorial de 12. Saludos. PD: Si gustan pongo la solución y pasamos al reto planteado por Og :) Título: Re: Retos C/C++ Publicado por: ghastlyX en 13 Septiembre 2010, 20:31 pm He reaprovechado un código que hice hace un tiempo que multiplica usando Karatsuba, por lo que el código es largo y feo. Si alguien lo prefiere dejo una versión nueva y más legible sin usar Karatsuba. De hecho, Karatsuba sólo se usa si los dos números a multiplicar son suficiente grandes (unos 100 dígitos) en mi código, pero lo dejo por si a alguien le interesa.
Código
Ahora pasemos al reto de Og. y a ver si alguien se anima, que es una dinámica sencillita. Título: Re: Retos C/C++ Publicado por: ace332 en 14 Septiembre 2010, 03:09 am Solved ::)
Código:
Reto #20: Dado un año N (N>=1600), determinar qué día será (o fue) el primero de enero de ese año. Por ejemplo para una entrada N = 2009, la respuesta seria 'Jueves'. Título: Re: Retos C/C++ Publicado por: ace332 en 19 Septiembre 2010, 20:19 pm Bueno parece que nadie se animo a resolver el reto por lo que aqui va la solución:
Código: #include <stdio.h> Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 27 Septiembre 2010, 00:09 am Publica el proximo reto.
Título: Re: Retos C/C++ Publicado por: ace332 en 27 Septiembre 2010, 02:37 am Bueno.. aqui va uno un tanto sencillo.
Citar Un número perfecto es un número natural que es igual a la suma de sus divisores propios positivos, sin incluirse él mismo. Dicho de otra forma, un número perfecto es aquel que es amigo de sí mismo. fuente: Wikipedia.Así, 6 es un número perfecto, porque sus divisores propios son 1, 2 y 3; y 6 = 1 + 2 + 3. Los siguientes números perfectos son 28, 496 y 8128. Reto #21: Hacer un programa que imprima en pantalla todos los números perfectos hasta un número N dado como entrada. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 27 Septiembre 2010, 05:23 am Código
PsData: En unas horas traigo reto... tengo un sueño que no me deja siquiera pensar. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 27 Septiembre 2010, 21:05 pm Reto #22: Dada dos fechas, verificar cuantos dias han transcurrido... se debe de tomar en cuenta los años bisiestos.
Título: Re: Retos C/C++ Publicado por: Wazzp en 29 Septiembre 2010, 00:06 am Disculpen mi impaciencia pero.. tengo un codigo,que a mi parecer esta bien,pero tiene un error ya que se cuelga y no hace nada.. alguien podria revisarlo? Si lo corrijo creo que solucionaria el reto # 22.. Respondan asi lo posteo,sino,borren este post y busco alguna otra forma de conseguir mi respuesta..
Gracias y Saludos :) Título: Re: Retos C/C++ Publicado por: [D4N93R] en 29 Septiembre 2010, 03:24 am Postealo a ver, lo vamos revisando y arreglando.
Saludos. Título: Re: Retos C/C++ Publicado por: Wazzp en 29 Septiembre 2010, 21:05 pm El codigo que tengo es..
Código
No entiendo porque no funciona!! El codigo compila sin warnings ni errores.. Título: Re: Retos C/C++ Publicado por: [L]ord [R]NA en 1 Octubre 2010, 04:16 am Termina el plazo de los 3 dias sin respuesta definitiva... Quien pondra el nuevo reto?
Título: Re: Retos C/C++ Publicado por: PiroskY en 2 Octubre 2010, 21:14 pm Código
no se con que dificultad vienen poniendo los retos, pero ya que nadie tira, pongo este, y si es facil bueno, el que lo haga que ponga otro mas complicado Reto #23: Ingresar dos cadenas e informar si la segunda está contenida o no dentro de la primera. Título: Re: Retos C/C++ Publicado por: Komodo en 3 Octubre 2010, 16:37 pm Código
RETO: Crear un programa que haga por fuerzabruta una comprobación de una posible pass, la longitud se ha de determinar en el transcurso del programa. Título: Re: Retos C/C++ Publicado por: ghastlyX en 3 Octubre 2010, 16:52 pm Si no recuerdo mal, la función strstr realiza la comprovación a lo bestia, es decir, si tenemos una string de n carácteres y queremos buscar en ella otra de m, para cada carácter de la primera mira si los m - 1 siguientes coinciden, quedando así un coste de O(nm).
Por si a alguien le interesa, existen algoritmos más eficientes para realizar esto, que consiguen costes de O(n + m), es decir, lineales sobre la longitud de las strings, como por ejemplo Knuth-Morris-Pratt. Título: Re: Retos C/C++ Publicado por: Komodo en 3 Octubre 2010, 16:57 pm Bueno siempre me ha servido para estas pequeñas aplicaciones strstr tampoco creo que sea malo usar strstr, que hayan métodos mejores, pues sseguro..
|