Solución a la Tarea 1: El Caracol
Existen diversas formas de resolver este problema. La más simple
de ellas consiste en efectuar un ciclo que simule el movimiento del
caracol dentro del agujero. Sin embargo, este procedimiento puede ser
muy lento, por ejemplo, si p
= 1,000,000, s = 2 y r = 1. Una forma un poco más
complicada, pero que resulta en un programa mucho más
rápido, es la de calcular directamente el valor de d como sigue: Sea d el número de días
necesario para que el caracol salga. Como después de d-1 días el caracol no ha
salido entonces se encuentra a una altura de (d-1)(s-r)
medida desde el fondo del agujero. Al día siguiente sube s, y
como eso es suficiente para salir entonces se cumple que (d-1)(s-r)
+ s >= p. Despejando, obtenemos que d >= (p-r)/(s-r).
Aquí el único problema es que a veces la división
es un número entero (el valor correcto de d) y a veces no (un valor
ligeramente menor al correcto), pero este problema se puede resolver
averiguando si s-r divide a p-r
o no.
#include
<stdio.h>
int main(void)
{
long int p, s, r, d;
scanf("%ld%ld%ld", &p,
&s, &r);
d = (p-r)/(s-r);
if ((p-r)%(s-r) != 0)
d = d + 1;
printf("%ld\n", d);
return 0;
}
También nos podemos ahorrar la decisión, escribiendo d = ((p-r)+(s-r-1))/(s-r).
¿Porqué funciona esto?
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada
Salida
10 12
2 1
10 10
1 1
10 7
4 2
10 2
1 9
9 7
1 2
14 8
5 3
159 20
9 14
2653 94
74 129
58979 459 23 136
323846 8164 7 40
Para probar su tarea en UNIX, escriban la instrucción gcc caracolNN.c -o caracol para
compilar su programa, y la instrucción ./caracol para correrlo.
Algunos errores comúnes fueron: (a) resolver bien el caso
exacto pero no el caso inexacto (b) no usar variables de tipo long int (c) ignorar el caso en
el que el caracol sale en un paso. Además, les recuerdo que
sólo deben enviar el archivo .c y que éste debe tener el
nombre correcto.