Vous êtes sur la page 1sur 32

Anlisis y diseos de algoritmos

EJERCICIOS RESUELTOS DE ACM PROFESOR: CESAR LIZA AVILA

El pequeo local de una tienda tiene un problema porque los asistentes lo encuentran difcil de solucionar, Cunto es el cambio que se da a los clientes! Se te ha solicitado ayudarles a escribir un programa que haga todo el trabajo.

3004 CHANGE O CAMBIO

Los billetes y monedas disponibles son las siguientes: Billetes: $20, $10, $5, $2, $1. Monedas: 50c, 20c, 10c, 5c. Como las monedas ms pequeas que estn disponibles son 5c, el costo de la compra necesita redondearse lo ms cercano a 5c, usando el mtodo sueco de redondeo. Las reglas para redondear son las siguientes: 1 o 2 centavos redondeados se baja a 0 3 o 4 centavos redondeados se sube a 5 6 o 7 centavos redondeados se baja a 5 8 o 9 centavos redondeados se sube a 10 El programa debe solucionar el cambio sugerido y especificar los billetes y monedas a utilizar. En cada caso, el nmero posible ms pequeo de billetes y monedas debe ser usado. Entrada Cada lnea de entrada representar una sola transicin y contendr 2 nmeros decimales en el rango 0.05 a 1000.00 cada dos dgitos despus del punto decimal y separado por un solo espacio. El primer nmero es el costo de la compra, el segundo, la equivalencia que los clientes ofrecen en la caja registradora. Como fue mencionado, el costo de la compra necesita redondearse y por supuesto la equivalencia ofrecida por el cliente es un mltiplo de 5 centavos. Una lnea consiste de dos 0.00 marca el final de la entrada. Salida Tu programa debe salir de una lnea para cada transaccin. Donde la equivalencia de dinero ofrecido por el cliente no sea suficiente para cubrir el redondeo del precio de la compra, tu programa debe salir: No es suficiente el dinero ofrecido. Donde la equivalencia de dinero ofrecido por el cliente es exactamente es el precio de la compra del redondeo, tu programa debe salir: Equivalencia exacta En los otros casos de salida, la secuencia describe el cambio. Cada secuencia de detalle empieza con un billete o valor de moneda en el formato anteriormente descrito (e.g., $2 o 10c), seguido por un signo de multiplicacin (i.e., un asterisco, `*') y termina con una repeticin de conteo (un numero ) Ejemplo de entrada 20.03 20.00 20.07 20.05 20.08 25.00 0.09 0.10 0.00 0.00 Ejemplo de salida No hay suficiente dinero ofrecido. Cantidad exacta. $2*2 50c*1 20c*2 Cantidad exacta.

El algoritmo esta desarrollado con GREEDY

3503 BIN PACKING o CUBOS EMPACADOS

El algoritmo esta desarrollado con GREEDY

4104 MODEX

El algoritmo esta desarrollado con DIVIDE Y VENCERAS

2452 - Cable master o cable principal


Habitantes de la tierra de las Maravillas han decidido celebrar un concurso regional de programacin. El Comit de Evaluacin se ha ofrecido y se ha comprometido a organizar el concurso ms honesto. Se decidi conectar las computadoras de los concursantes mediante una topologa de "estrella" - es decir, conectar a todos a un solo eje central. Para organizar un concurso verdaderamente honesto, el Jefe de la Comisin de Evaluacin ha decretado lugar a todos los concursantes por igual en todo el centro de una igual distancia de l. Para comprar los cables de red, el Comit de Evaluacin se ha puesto en contacto con un proveedor de soluciones de red local con una solicitud para vender un nmero determinado de cables con la misma longitud. El Comit quiere que los cables sean tan largos como sea posible para sentar a los concursantes tan lejos cada uno de otros como sea posible.

El Master Cable de la empresa fue asignado a la tarea. l sabe la longitud de cada uno de los cables en el almacn, hasta cada centmetro, y puede cortar con una precisin de centmetros si se le dice la longitud de las piezas que debe cortar. Sin embargo, esta vez, la longitud no se conoce y el cable Master est completamente perplejo.

Tienes que ayudar a Master Cable, haciendo un programa que determine la mxima distancia posible en l que puede cortar los cables que tiene en stock, para obtener el numero determinado de piezas.

Entrada:

La entrada comienza con un entero positivo en una lnea por s mismo indicando el nmero de los casos siguientes, cada uno de ellos como se describe a continuacin. Esta lnea es seguida por una lnea en blanco, y tambin hay una lnea en blanco entre dos entradas consecutivas.

La primera lnea del archivo de entrada contiene dos nmeros enteros N y K, separadas por un espacio. N (1 n 10000) es el nmero de cables en el Stock, y K (1 K 10000) es el nmero de piezas solicitadas. La primera lnea es seguida por N lneas con un nmero en cada lnea, que especifican la longitud de cada uno de los cables en stock en metros. Todos los cables miden por lo menos 1 metro y el mximo de 100 kilmetros de longitud. Todas las longitudes en el archivo de entrada estn escritas con una precisin de centmetros, con exactamente dos dgitos despus de un punto decimal.

Salida

Para cada caso de prueba, la salida debe seguir la descripcin a continuacin. Los resultados de dos casos deben ser separados por una lnea en blanco.

Escribir en el archivo de salida la longitud mxima (en metros) de las piezas que Master Cable opto en cortar los cables en el stock para obtener el nmero solicitado de piezas. El nmero debe estar escrito con una precisin de centmetros, con exactamente dos dgitos despus de un punto decimal. Si no es posible reducir el nmero pedido de piezas de cada uno de ellos, sea al menos un centmetro de largo y, a continuacin, el archivo de salida debe contener el nmero "0,00" (sin las comillas).

Ejemplo de entrada: 1 4 11 8.02 7.43 4.57 5.39

Ejemplo Salida: 2.00

El algoritmo esta desarrollado con DIVIDE Y VENCERAS

2610 - Change Back o cambiar valores


Modernas tiendas de comestibles ahora tienen a menudo un U-Scan" carril de la caja - que permite al cliente escanear y comprobar sus propios alimentos, sin la necesidad de un inspector. Estos carriles de cambio exigen que se proporcione automticamente un cambio, despus de que el cliente entra en caja. Usted est para escribir un programa que calcula los billetes y monedas que se dispensan, reducir al mnimo el nmero total de billetes y monedas. . (Esto es, para el cambio total de US $ 5,50, no debe prescindir de los 5 y 50 centavos, pero de $ 5 y un proyecto de ley de 50 centavos pieza.) Los billetes y monedas disponibles para usted a dispensar son los siguientes: Billetes de: $50, $20, $10, $5 y $1 Monedas de: 50, 25, 10, 5, 1 entrada El archivo de entrada constar de dos nmeros por lnea, cada uno que constituye una transaccin. El primer nmero es la cantidad de la compra, y el segundo uno es el importe ofertado por el cliente. Usted puede asumir que el importe ofertado es mayor o igual al importe de la compra. La entrada se dar por terminado por una lnea con dos nmeros 0. salida De salida para cada transaccin ser una serie de lneas que muestra la cantidad de cambio regres y se detalla el nmero de billetes y monedas que se dispensan en cambio, en orden descendente de cantidad monetaria, una unidad por lnea. Si un billete/ moneda no es necesario en el cambio devuelto, no se produce la salida de billetes/ monedas. (En otras palabras, no se muestran 0 $ 1 billete".) El uso de plurales es necesario, como se muestra a continuacin. Transacciones separadas por una lnea en blanco. Ejemplo de entrada 42.15 50.00 2.07 5.00 99.99 100.00 0.0 0.0 Ejemplo de salida TRANSACTION #1: $7.85 1 $5 bill 2 $1 bills 1 50-cent coin 1 25-cent coin 1 10-cent coin TRANSACTION #2: $2.93 2 $1 bills 1 50-cent coin 1 25-cent coin 1 10-cent coin 1 5-cent coin 3 1-cent coins TRANSACTION #3: $0.01 1 1-cent coin

El algoritmo esta desarrollado con GREEDY

3379 - Two Ends o dos finales


En el juego de dos jugadores ``dos extremos ", un nmero par de naipes se presentan en una fila. En cada naipe, cara arriba, se escribe un nmero entero positivo. Los jugadores toman las vueltas que quitan un naipe de cualquier final de la fila y que colocan el naipe en su pila. El jugador que agregan naipes hasta el nmero ms alto gana el juego. Ahora una estrategia es escoger simplemente un naipe en el extremo que es el ms grande - llamaremos esto la estrategia codiciosa. Sin embargo, esto no es siempre ptimo, pues el ejemplo siguiente demuestra: (El primer jugador ganara si el primero escogera los 3 en vez de los 4.) 3 2 10 4 Usted debe determinar exactamente qu tan mala la estrategia codiciosa es para juegos diferentes cuando el segundo jugador la usa pero el primer jugador est en libertad para usar cualquier estrategia que l desea. Entrada Habr casos mltiples de la prueba. Cada caso de la prueba ser contenido en una lnea. Cada lnea comenzar con un nmero entero uniforme n seguido por nmeros enteros del positivo de n. Un valor de n = 0 indica el extremo de la entrada. Usted puede asumir que n no es no ms de 1000. Adems, usted puede asumir que la suma de los nmeros en la lista no excede de 1.000.000. Salida Para cada caso de la prueba usted debe imprimir una lnea de salida de la forma: Donde est el nmero m del juego (que empieza el juego 1) y p es la diferencia posible mxima entre la cuenta del primer jugador y la segunda cuenta del jugador cuando el segundo jugador utiliza la estrategia codiciosa. Al emplear la estrategia codiciosa, tome siempre el extremo ms grande. Si hay un lazo, quite el extremo izquierdo. Ejemplo de entrada 4 3 2 10 4 812345678 822153873 0 Ejemplo de salida In game 1, the greedy strategy might lose by as many as 7 points. In game 2, the greedy strategy might lose by as many as 4 points. In game 3, the greedy strategy might lose by as many as 5 points.

El algoritmo esta desarrollado con PROGRAMACION DINAMICA

3304 - Sudoku
Sudoku es una tarea muy sencilla. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3 x 3 Una mesa cuadrada con 9 filas y 9 columnas se divide a 9 plazas ms pequeas de 3 x 3 as shown on the Figure. como se muestra en la Figura. In some of the cells are written decimal digits from 1 to 9. En algunas de las celdas se escriben dgitos decimales del 1 al 9. The other cells are empty. Las otras celdas estn vacas. The goal is to fill the empty cells with decimal digits from 1 to 9, one digit per cell, in such way that in each row, in each column and in each marked 3 x 3 El objetivo es llenar las celdas vacas con dgitos decimales de 1 a 9, un dgito en cada celda, de tal manera que en cada fila, en cada columna y en cada marca de 3 x 3 subsquare, all the digits from 1 to 9 to appear. subcuadro, todos los dgitos del 1 al 9 aparescan. Write a program to solve a given Sudoku-task. Escribir un programa para resolver un Sudoku-tarea.

Entrada Los datos de entrada se iniciarn con el nmero de casos de prueba. For each test case, 9 lines follow, corresponding to the rows of the table. Para cada caso de prueba, las 9 lneas, que corresponden a las filas de la tabla. On each line a string of exactly 9 decimal digits is given, corresponding to the cells in this line. En cada lnea de una cadena de exactamente 9 dgitos decimales se da, lo que corresponde a las clulas en esta lnea. If a cell is empty it is represented by ` 0 '. Si una celda est vaca, es representado por `0 '. Salida Para cada caso de prueba el programa debe imprimir la solucin en el mismo formato que los datos de entrada. The empty cells have to be filled according to the rules. La celdas vacas tienen que ser rellenadas de acuerdo con las normas. If solutions is not unique, then the program may print any one of them. Si las soluciones no es exclusivo y, a continuacin, el programa puede imprimir cualquiera de ellos. Ejemplo de entrada 1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107 Ejemplo de salida 143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127

El algoritmo esta desarrollado con BACKTRACKING

3170 AGTC
Sean X e Y dos cadenas de ms de un alfabeto finito A. Nos gustara transformar x en y permitiendo que las operaciones slo se dan a continuacin: Supresin: una carta en x falta en y en una posicin correspondiente. Insercin: en una carta y no se encuentra en x en la posicin correspondiente. Cambio: las letras en las posiciones correspondientes son distintos Ciertamente, nos gustara minimizar el nmero de todas las posibles operaciones. Ilustracin

Eliminacin: * en la lnea de fondo Insercin: * en la lnea superior Cambio: cuando las letras en la parte superior e inferior son distintas

Esto nos dice que la transformacin x = y = AGTCTGACGC en AGTAAGTAGGC que podra ser necesario para realizar las operaciones de 5 (2 cambios, 2 supresiones y la 1 insercin). Si queremos reducir al mnimo las operaciones numricas, hay que hacerlo como

Esto nos dice que la transformacin x = y = AGTCTGACGC en AGTAAGTAGGC que podra ser necesario para realizar las operaciones de 5 (2 cambios, supresiones y la insercin 2 1). Si queremos reducir al mnimo las operaciones numricas, hay que hacerlo como y 4 se mueve sera necesario (3 cambios y la supresin 1). En este problema tenemos siempre en cuenta las cadenas X e Y de ser fijo, de tal manera que el nmero de letras en x es m es el nmero de letras en donde nm y n.

Asignar 1 como el costo de una operacin que se realiza. De lo contrario, asignar 0 si no hay operacin realizada.

Escriba un programa que reduzca al mnimo el nmero de operaciones posibles para transformar cualquier cadena x en una y cadena.

entrada De entrada contiene varios conjuntos de datos. Cada conjunto de datos consiste en la cadenas x e y prefijado por sus longitudes respectivas, una en cada lnea.

salida Para cada conjunto de datos, un entero que representa el nmero mnimo de operaciones posibles para transformar cualquier cadena x en una y cadena.

Ejemplo de entrada 10 AGTCTGACGC 11 AGTAAGTAGGC

Ejemplo de salida

El algoritmo esta desarrollado PROGRAMACION DINAMICA

2113 - It's time for change o Es hora de cambiar


Louie, apuesto que hay ms de 200 maneras de hacer el cambio para un dlar." "Usted est en Frankie, slo hay 5 monedas y slo 100 centavos. Todo el mundo sabe que slo puede haber 100 formas diferentes." "Oh si, Puedo probarlo. Reloj." Escribir un programa que determina el nmero de las siguientes maneras de las monedas de EE.UU. se pueden combinar para hacer sumas de dinero hasta a 2 dlares. Penny - $0.01 Nickel - $0.05 Dime - $0.10 Quarter - $0.25 Half Dollar - $0.50 Entrada La entrada constar de una secuencia de lneas, cada lnea indicando la cantidad de cambio necesario. Input terminates with a value of 0. La entrada termina con un valor de 0. Salida Para cada valor de entrada, una lnea que indica X Hay maneras de hacer $ Y donde X es el nmero de formas, e Y es el valor de entrada. Cada entrada debera haber establecido una lnea de produccin. Despus de todos los insumos conjuntos se han llevado a cabo, el programa debe imprimir `End of Output'. Ejemplo de entrada 1.00 0.51 0 Ejemplo de Salida

El algoritmo esta desarrollado con PROGRAMACION DINAMICA

3291 - Understanding Recursion


Entender la recursin no es fcil pero, por desgracia, para resolver este problema es necesario comprenderla muy bien. A continuacin puedes ver un programa escrito en C, que tiene como entrada un mximo de 40.000, enteros de 32 bits y produce una salida. Contina hacindolo hasta que aparezca el elemento cero. Su trabajo consiste en mostrar la salida que produce el siguiente programa. #include<stdio.h> #include<math.h> int const MAX=40000; long nums[MAX]; long recur(int i,int j,int N) { long t1=0,t2=0,t=0; if(i<0 || j<0 || i>=N || j>=N) return 0; if(i==j) t=recur(i+1,j+1,N); if(i<=j) t1=(nums[i]>nums[j])+recur(i,j+1,N); if(i>=j) t2=(nums[i]>nums[j])+recur(i,j-1,N); return t1+t2+t; } int main(void) { long int i,j,N,kase=0; freopen("d.in","r",stdin); while(1) { scanf("%d",&N); for(i=0;i<N;i++) scanf("%ld",&nums[i]); if(N==0) break; printf("Case %d: %ld\n",++kase,recur(0,0,N)); } return 0; } Entrada El archivo de entrada contiene un mximo de 10 conjuntos de entrada. La descripcin de cada uno de los conjuntos es la siguiente: La primera lnea de cada conjunto es un nmero entero N (0 N 40000) que indica cuntos nmeros son en esta serie. Cada una de las siguientes lneas N contiene un nmero. Todos estos nmeros son inferiores al 2000000001. La entrada es enunciado por una serie donde el valor de N es igual a cero. salida El archivo de entrada para producir la salida que el programa anterior producir (suponiendo que se ejecutar sin problemas en el equipo y no se producirn de desbordamiento de pila) para el archivo de entrada dado. Ejemplo de entrada 4 1 2 3 4 2 6 1 0 Ejemplo de salida Case 1: 6 Case 2: 1

El algoritmo esta desarrollado con DIVIDE Y VENCERAS

2759 - Common Subsequence


Un posterior de una determinada secuencia es la secuencia dada con algunos elementos (posible ninguna) al margen. Dada una secuencia X = <x1, x2, ..., xm> otra secuencia Z = <z1, z2, ..., zk> es una posterior de X si existe una secuencia estrictamente creciente <i1, i2, .. ., ik> de los ndices de X tales que para todos los j = 1,2 ,..., k, xij = zj. Por ejemplo, Z = <a, b, f, c> es una posterior de X = <a, b, c, f, b, c> con ndice secuencia <1, 2, 4, 6>. Habida cuenta de dos secuencias X e Y el problema es encontrar la longitud de la mxima longitud comn posterior de X y Y. Entrada El programa de entrada es a partir de un archivo de texto. Cada conjunto de datos en el archivo contiene dos cadenas de caracteres que representan a las secuencias dadas. Las secuencias estn separadas por cualquier nmero de espacios en blanco. Los datos de entrada son correctos. Salidad Para cada conjunto de datos que el programa imprime en la salida estndar la longitud de la mxima longitud comn posterior desde el comienzo de una lnea separada. Ejemplo entrada abcfbc abfcab programming contest abcd mnp Ejemplo salidad 4 2 0

El algoritmo esta desarrollado con PROGRAMACION DINAMICA

3195 - Zipper

Dado tres cuerdas, que son para determinar si la tercera cuerda puede estar formado por la combinacin de los caracteres en los primeros dos cadenas. Las dos primeras cadenas pueden ser mezclados de manera arbitraria, pero cada uno debe permanecer en su orden original. Por ejemplo, considerar la formacin de `` tcraete "de `` gato" y `` rbol ": Cadena A: Gato Cadena B: rbol Cadena C: tcraete Como puedes ver, podemos formar la tercera cuerda por la alternancia de los personajes de las dos cadenas. Como segundo ejemplo, considerar la formacin de `` catrtee "de `` gato" y `` rbol ": Cadena A: Gato Cadena B: rbol Cadena C: tcraete Por ltimo, notar que es imposible formar `` cttaree "de `` gato" y `` rbol ". entrada La primera lnea del archivo de entrada, b.in, contiene un nico entero positivo entre 1 y 1000. Se representa el nmero de conjuntos de datos que siguen. El procesamiento para cada conjunto de datos es idntico. Los conjuntos de datos aparecen en las siguientes lneas, los datos de un juego por la lnea. Para cada conjunto de datos, la lnea de entrada consta de tres cadenas, separadas por un espacio nico. Todas las cadenas se componen de alta y minsculas solamente. La longitud de la cadena tercera siempre es la suma de las longitudes de las dos primeras cuerdas. Las dos primeras cadenas que tienen una longitud de entre 1 y 200 caracteres, ambos inclusive. salida Para cada conjunto de datos, de impresin: Conjunto de datos N: S si la cadena tercero puede ser formado a partir de los dos primeros, o Conjunto de datos n: no hay si no puede hacerlo. Por supuesto n debe ser sustituido por el nmero conjunto de datos. Vea la salida de la muestra a continuacin un ejemplo. Ejemplo de entrada 3 cat tree tcraete cat tree catrtee cat tree cttaree Ejemplo de salida Conjunto de datos 1: s Conjunto de datos 2: s Conjunto de datos 3: No

El algoritmo esta desarrollado con PROGRAMACION DINAMICA

4245 - Su-Su-Sudoku

El algoritmo esta desarrollado con BACKTRACKING

3389 - Quick Change

El algoritmo esta desarrollado con GREEDY

El algoritmo esta desarrollado con PROGRAMACION DINAMICA