Vous êtes sur la page 1sur 4

PHRISIS

Problema B: Caracolito
Quin no recuerda cuando alguno de nuestros padres se aprovechaba de nuestra
ingenuidad y nos planteaba el siguiente problema Un caracolito se encuentra en
el fondo de un pozo de 5 metros. El caracolito quiere salir del pozo y sube 3
metros en el da, pero cuando cae la noche se duerme y se resbala bajando 2 de
los tres que haba subido, Cuntos das tarda el caracol en salir?, muy
inocentemente contestabas: en 5 das. Ellos se rean un rato y te decan: Ests
mal, es en tres. Para nuestra mala fortuna ellos tenan toda la razn,
efectivamente era en tres das, ya que es ilgico que en el tercer da cuando el
caracolito alcanzaba llegar al borde del pozo, se quedara dormido esperando a
que se resbalase de nuevo.
Tu problema consiste en dados p, d, n, enteros positivos menores que 10^9,
determinar el nmero mnimo de das que tarda en salir el caracolito desde el
fondo de un pozo de p metros de profundidad, si el caracolito escala durante el da
d metros, mientras que la noche resbala n metros mientras duerme.
ENTRADA
La entrada consiste primero de un nmero nc que indica el nmero de casos a
procesar. Le siguen nc casos, cada uno de ellos en una lnea diferente con tres
nmeros enteros positivos p, d y n.
SALIDA
Por cada caso debes imprimir una lnea con el nmero mnimo de das que tarda
el caracolito en salir del pozo. En caso de que no pueda salir del pozo imprime
Imposible sin las comillas.

La solucin consiste en primer fijarse en lo que pide de cmo debe funcionar


el programa primeramente las entradas:
Dice la entrada consiste primero de un nmero nc que indica el nmero de
casos. Pero esto debe ser ingresado por el teclado
Luego dice le siguen nc casos, cada uno de ellos en una lnea diferente con tres
nmeros enteros positivos p, d y n.
Utilizamos un entero para almacenar nc que representa el nmero de casos, sea
cuantas veces se va una solucin. Para la cual hacemos un bucle para nc hasta
que sea cero

PHRISIS

void main()
{
int nc;
int p,d,n;
scanf("%d",&nc);
while(nc!=0)
{

n-- ;
}
}
Ahora tenemos que almacenar la variables p, d y n para lo cual llamamos la
funcin Scanf() que se desarrollar, que cumple los requisitos del problema
(que guarde el formato de una lnea al momento de ingresar las variables p, d
y n y adems deja el cursor en la misma lnea)
void main()
{
int nc;
int p,d,n;
cscanf("%d",&nc);
while(nc!=0)
{
p=Scanf();
d=Scanf();
n=Scanf();

nc--;
}
}
Seguido de esto ponemos la condicin es posible o no es posible que el
caracolito pueda salir del pozo.
El caracolito no podr salir si:
- d igual a n y p mayor que d o n. solo entonces no ser posible que haya
una solucin al problema.
En caso que si haya una solucin llamaremos a la funcin Solution(p,d,n),
que recibe tres parmetros (profundidad del pozo, distancia que sube en un
da y la distancia que resbala durante noche) en nmeros enteros (metros),
esta funcin retorna el nmero de das que demora en salir del pozo el
caracolito.

PHRISIS

v o id m a i n ( )
{
int nc;
int p,d,n;
c s c a n f ( " % d " , &n c ) ;
while(nc!=0)
{
p=Scanf();
d=Scanf();
n=Scanf();
( d < = n & &p > d ) ? c p r i n tf ( " \ t I m p o s i b l e \n " ) :c p r in t f ( " \ t % d \ n " , S o lu t io n ( p , d , n ) ) ;
nc--;
}
}

Ahora paramos a definir las funciones usadas en la solucin del problema,


primeramente Scanf(), esta funcin captura un nmero entero por el teclado,
retorna el nmero ingresado y deja el cursos en la misma lnea, la funcin
termina al presionar la barra espaciadora o enter.
int Scanf()
{
int c,n=0;
while(1)
{
c = getch();
if(c==13||c==32){cprintf("\t");break;}
cprintf("%c", c);
n=10*n+(int(c)-48);
}
return n;
}
Seguidamente definimos la funcin ms importante del problema, la funcin
que resuelve el problema cuando se sabe que hay una solucin la funcin
Solution(p,d,n), como se dijo anteriormente esta funcin retorna los dias que
demora en salir de un pozo de profundidad p, subiendo d metros por da y
resbalando n metros por noche.
int Solution(int p, int d, int n)
{
return (p-d<=0)?1:1+Solution(p-(d-n),d,n);
}
Si p menos d es menor o igual a 0 entonces acaba de salir el caracolito del
pozo (sea es el da actual, un da), en caso contrario se para el siguiente da
y se repite la actividad.
El valor de retorno es los das acumulados.

PHRISIS

CDIGO COMPLETO
/*
*
*/

caracolito.c

# in c lu d e < c o n i o . h >

b y: P H R I S I S
/ / p ar a l a s f u n c i o n e s cs c a n f , c p r i n tf , c l r s c r y g e t c h .

i n t S o lu t i o n ( i n t p , in t d , in t n ) { r e tu r n ( p - d < = 0 ) ? 1 : 1 + S o l u t i o n ( p - ( d - n ) , d , n ) ; }
int Scanf()
{
int c,n=0;
while(1)
{
c = getch();
i f ( c = = 1 3 | | c = = 3 2 ) { c p r i n t f ( " \ t" ) ; b r e ak ; }
cprintf("%c", c);
n = 1 0 * n + ( i n t( c ) - 4 8 ) ;
}
r e tu r n n ;
}
v o id m a i n ( )
{
c l r s cr ( ) ;
int nc;
int p,d,n;
c s c a n f ( " % d " , &n c ) ;
while(nc!=0)
{
p=Scanf();
d=Scanf();
n=Scanf();
( d < = n & &p > d ) ? c p r i n tf ( " \ t I m p o s i b l e \n " ) :c p r in t f ( " \ t % d \ n " , S o lu t io n ( p , d , n ) ) ;
nc--;
}
getch();
}
Pr o b a d l o y ma n d a d m e s u s c o me n t a r io s

Vous aimerez peut-être aussi