Ayuda con problemas de logica

    • Volrath89
      Volrath89
      Bronce
      Registro: 07-23-2008 Artículos: 2.171
      Hola,


      Alguien que me colabore con estos problemas (y otros), lo importante no es tanto la solucion, sino que se haga con la tecnica de dividir y conquistar (es decir, preferiblemente busco auyuda de ing. informaticos)

      Contactenme por skype si son buenos con este tipo de problemas: volrath891



      Obviamente hay pago....



      Para cada uno de los siguiente problemas especi que formalemente y resuelva usando la tecnica de dividir
      y conquistar
      1. El nenufar es un planta que dobla su super cie cada mes. Si dos nenufares tardan N meses para cubrir
      un peque~no estanque, >Cuanto tardara un solo nenufar para cubrir el mismo estanque?
      2. Existen dos tipos de particulas dentro de un reactor nuclear. A cada segundo una particula A se dividira en dos partculas B, y una partcula B se dividira en una partcula A y dos partculas B. Si solo hay una
      partcula A en el reactor en el instante t=0, >Cuantas partculas hay en total para t= N?
      3. Nos regalan inicialmente X estampillas y decidimos comenzar la coleccion. Si cada a~no compramos
      el doble de lo que tenemos y ademas recibimos Y estampillas regaladas. >Al cabo de cuantos a~nos
      tendremos Z estampillas?.
      4. Si en el caso de las estampillas del problema anterior, en lugar de recibir estampillas perdemos Y
      estampillas y compramos la mitad de estampillas del año anterior. >Al cabo de n a~nos cuantas estampillas
      tendremos?.
  • 12 respuestas
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      1. N+1 meses. Esta es muy sencilla. Si dos nenúfares cubren cada uno 1/2 estanque, un mes después cada una cubriría un estanque completo, al ocupar el doble.

      2. Hrmflfhmr, no saco la progresión. 1, 2, 6, 17, 37, 99...

      3. Un script para sacarlo:

      $estampillastotales = $xestampillas;
      $year=0;
      while ($estampillastotales < $zestampillas)
      {
      $estampillastotales += ($estampillastotales*2) + $yestampillas;
      $year++;
      }
      return $year;


      4. Lo mismo:

      $cyear=0;
      $estampillastotales = $xestampillas;
      while ($cyear <= $nyear)
      {
      $estampillastotales += ($estampillastotales/2) - $yestampillas;
      $cyear++;
      }
      return $estampillastotales;
    • Volrath89
      Volrath89
      Bronce
      Registro: 07-23-2008 Artículos: 2.171
      ty Jon :)

      Algunos màs por si estan aburridos :P


      5. En un supermercado se desea apilar las naranjas en una piramide de base triangular de forma que cada naranja se encuentre en contacto con tres de la capa inferior. >Cuantas naranjas serian necesarias para formar una piramide de n-capas?. (Ayudese de un dibujo o de objetos esfericos).
      6. En el primer dia de un nuevo año, Jose deposita $N en una cuenta que paga un interes compuesto
      mensual del I%. Al principio de cada mes el agrega $M a esa cuenta. Si continua haciendo esto durante
      los X a~nos siguientes. >Cuanto dinero tendria en su cuenta despues de esos X a~nos?.
      7. Para n personas que asisten a una reunion, >Cuantos saludos en total se pueden dar?.
      8. Se apilan chas de colores verde, azul blanco, rojo. Encontrar el numero de formas de apilar n chas sin
      que queden la blanca al inicio y azules consecutivas.


      El siguiente lo tengo que llevar hecho en Java o C++ para el lunes, quien se le mida peude agregarme al skype para cuadrar el pago (tiene q tener moneybookers o stars) y darle las especificaciones de input/output etc :)

      Dado un tablero de NxN encuentre el camino desde una posicion inicial en la primera la, hasta una posicion nal en la ultima la que maximice la cantidad de dinero obtenida. Cada posicion de la matriz contiene el valor a obtener si pasa por esa posicion. La persona solo se puede mover hacia adelante
      diagonalmente o en linea recta, es decir si esta en la posicion (x,y) se podria mover a (x + 1, y - 1), (x + 1, y) o a (x + 1, y + 1).


      skype: volrath891
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      7 - Esta ya la tenía pensada :roto2: Recuerdo una conversación al respecto con un amigo matemático. La progresión es 2, 3, 6, 10, 15, 21... es decir, por cada persona se añaden todas las personas anteriores.

      en C++, a grandes rasgos:

      int saludostotales = 0;
      int i = 1;
      int personastotales = 10; //las que sean

      while(i < personastotales)
      {
      saludostotales = saludostotales + i;
      i++;
      }
      return saludostotales;


      Se entiende que una sola persona no se saluda a sí misma, así que necesitamos 2 para tener un saludo. A partir de ahí, es sumar.
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      original de Volrath89

      Dado un tablero de NxN encuentre el camino desde una posicion inicial en la primera la, hasta una posicion nal en la ultima la que maximice la cantidad de dinero obtenida. Cada posicion de la matriz contiene el valor a obtener si pasa por esa posicion. La persona solo se puede mover hacia adelante
      diagonalmente o en linea recta, es decir si esta en la posicion (x,y) se podria mover a (x + 1, y - 1), (x + 1, y) o a (x + 1, y + 1).
      Hay un error en el enunciado. Faltan letras :roto2:
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      El 2 en PHP hecho así en rápido. Hace mucho que no uso C y no recuerdo los nombres de la mayoría de las funciones, pero te puedes hacer una idea de la algoritmia y adaptar:

      $cadena="a";
      $i=1;
      $n=90; # los que sean
      $itotalparticulas=0;

      while ($n>$i++)
      {
      $cadena = str_replace("a","xx", $cadena); # x es un valor temporal
      $cadena = str_replace("b","abb",$cadena);
      $cadena = str_replace("x","b",$cadena); # que volvemos a cambiar aquí
      }
      return strlen($cadena);


      Se podría usar una expresión regular también, ahorrando el str_replace, o un array de búsquedas, así:

      $cadena="a";
      $i=1;
      $n=90; # los que sean
      $busqueda = array("a", "b");
      $cambio = array("bb", "abb");
      $itotalparticulas=0;

      while ($n>$i++)
      {
      $cadena = str_replace($busqueda,$cambio, $cadena);
      }
      return strlen($cadena);
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      original de Volrath89

      6. En el primer dia de un nuevo año, Jose deposita $N en una cuenta que paga un interes compuesto
      mensual del I%. Al principio de cada mes el agrega $M a esa cuenta. Si continua haciendo esto durante
      los X a~nos siguientes. >Cuanto dinero tendria en su cuenta despues de esos X a~nos?.


      Mira, una función en C que lo hace :P


      float CalcularPasta (float fN, float fI, float fM, int iYear)
      {
      int iMes = iYear*12; // meses totales

      for(i=0;i<=iMes;i++)
      {
      fN = fN + (fN*fI) + fM;
      }
      return fN;
      }
    • Volrath89
      Volrath89
      Bronce
      Registro: 07-23-2008 Artículos: 2.171
      original de Jon
      Hay un error en el enunciado. Faltan letras :roto2:
      Si.. es que lo copie de PDF y las tildes dañaron todo



      Dado un tablero de NxN encuentre el camino desde una posicion inicial en la primera fi la, hasta una posicion fi nal en la ultima fila que maximice la cantidad de dinero obtenida. Cada posicion de la matriz contiene el valor a obtener si pasa por esa posicion. La persona solo se puede mover hacia adelante
      diagonalmente o en linea recta, es decir si esta en la posicion (x,y) se podria mover a (x + 1, y - 1), (x + 1, y) o a (x + 1, y + 1).


      Agrego: Los valores de la matriz son solo positivos, no hay ceros.
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      Vaya, esa es más complicada. Mentalmente es muy fácil, siempre va a ser recorrer n en 'x' y n en 'y'. La diagonal solo nos hace perder valor. Ahora, para que el programa lo tenga en cuenta, y lo decida por sí mismo, ya hay que meditar una función un poco más compleja.

      Hm...
    • Sargot
      Sargot
      Bronce
      Registro: 12-31-2008 Artículos: 255
      No sé si entendí bien el enunciado, más que nada porque lo que ha dicho Jon en este último post me ha descolocado un poco.

      De todas formas, si es como creo que es, consistirá en hacer programación dinámica. Vas a tener que hacer una función dentro de la cual tendrás tres llamadas a la misma función (cada una para cada uno de los posibles movimientos). Antes de llamar a la función en la que te moverás x+1 y-1 tienes que comprobar que no te vas a salir de matriz(porque y se convierta en negativo) y antes de llamar a la función en la que te moverás x+1 y+1 tienes que comprobar que no te vas a salir de la matriz(porque y sea mayor que n).
      Dejarás de hacer recursividad hasta que X llegue a N. Cada vez que pases por la función irás incrementando un valor que te diga lo que estés ganando con ese recorrido de tal forma que al llegar al final, lo comparas con el valor máximo que has que tenías hasta ese momento para saber si lo tienes que sustituir o no. En caso de sustitución, tendrás que guardar que recorrido has usado para saber cual es el valor momentáneo más alto (por lo que necesitarás un vector de X-N posiciones donde guardes la Y que estés usando en cada parte del reocorrido).

      Una vez que el programa haga todas las llamadas (como sea una matriz con un N muy grande puede que se tire bastante tiempo ejecutándose) tendrás el valor máximo obtenido y el recorrido hecho para ese valor.

      Esa es la idea básica, hay que tener unas cuantas cosas en cuenta, pero es practicamente hacer eso. Si lo hicieras a mano sería como recorrer casilla por casilla, probando todos los recorridos posibles hasta que des con el que el te da un valor mas alto.
    • shulorio
      shulorio
      Bronce
      Registro: 01-10-2010 Artículos: 1.784
      original de Jon
      El 2 en PHP hecho así en rápido. Hace mucho que no uso C y no recuerdo los nombres de la mayoría de las funciones, pero te puedes hacer una idea de la algoritmia y adaptar:

      <div style="background:white;color:green;width:500px;border:1px dotted black; padding:1em;"><pre>$cadena="a";
      $i=1;
      $n=90; # los que sean
      $itotalparticulas=0;

      while ($n>$i++)
      {
      $cadena = str_replace("a","xx", $cadena); # x es un valor temporal
      $cadena = str_replace("b","abb",$cadena);
      $cadena = str_replace("x","b",$cadena); # que volvemos a cambiar aquí
      }
      return strlen($cadena);</pre></div>

      Se podría usar una expresión regular también, ahorrando el str_replace, o un array de búsquedas, así:

      <div style="background:white;color:green;width:500px;border:1px dotted black; padding:1em;"><pre>$cadena="a";
      $i=1;
      $n=90; # los que sean
      $busqueda = array("a", "b";) ;
      $cambio = array("bb", "abb";) ;
      $itotalparticulas=0;

      while ($n>$i++)
      {
      $cadena = str_replace($busqueda,$cambio, $cadena);
      }
      return strlen($cadena);</pre></div>
      Jon no te compliques que es muy facil, te equivocaste en la secuencia que es:

      1-2-6-16-44-...

      esto es la serie de fibonacci por 2, el sigiente numero es la suma de los dos anteriores multiplicado por 2.

      esto es porque el numero de A para un instante es el mismo que habia de B en el instante justamente anterior

      (An-1+Bn-1)*2

      o lo que es lo mismo

      (Bn-1 + Bn-2)*2


      En programacion para estos calculos es mejor y mas sencillo hacer una función recursiva tal que asi:



      f(N){
      if (N==0) return 1;
      else if (N==1) return 2;
      else return (f(N-1)*2 + f(N-2)*2);
      }
    • shulorio
      shulorio
      Bronce
      Registro: 01-10-2010 Artículos: 1.784
      original de Volrath89
      original de Jon
      Hay un error en el enunciado. Faltan letras :roto2:
      Si.. es que lo copie de PDF y las tildes dañaron todo



      Dado un tablero de NxN encuentre el camino desde una posicion inicial en la primera fi la, hasta una posicion fi nal en la ultima fila que maximice la cantidad de dinero obtenida. Cada posicion de la matriz contiene el valor a obtener si pasa por esa posicion. La persona solo se puede mover hacia adelante
      diagonalmente o en linea recta, es decir si esta en la posicion (x,y) se podria mover a (x + 1, y - 1), (x + 1, y) o a (x + 1, y + 1).


      Agrego: Los valores de la matriz son solo positivos, no hay ceros.

      mmm No entiendo el enunciado. si solo puedo avanzar hacia adelante y forzosamente empiezo en la posición 1 de la primera fila y tengo que acabar por narices en la ultima posición de la ultima fila, en un tablero NxN solo existe un camino posible que es la diagonal. Asi que me estoy perdiendo algo del enunciado (¿no se puede mover en vertical?)
    • Jon
      Jon
      Bronce
      Registro: 09-13-2006 Artículos: 3.927
      Las funciones recursivas las carga satán :roto2:

      Pero sí, miraba los números y veía que algo había :D

      Respecto a lo último, existen varios caminos. No quieres llegar antes, quieres llegar pasando por el máximo número de casillas posible, lo cual da bastantes más resultados. Para que nos entendamos:

      x x x x
      x x x x
      x x x x
      x x x x

      Podrías hacer el siguiente camino:

      x x x y
      x x x y
      x x x y
      y y y y

      o este otro:

      x x y y
      x x y x
      x y y x
      y y x x

      En ambos casos pasas por el mismo número de casillas, que es mayor que en el ejemplo que tú dices:

      x x x y
      x x y x
      x y x x
      y x x x

      El objetivo era pasar por más posiciones.


      Edit: De hecho, no, cada posición de la matriz tiene un valor, así que el objetivo es buscar aquellas posiciones con valores más altos e intentar pasar por todas ellas yendo solo en una dirección :roto2:

      Mis ejemplos tampoco sirven :facepalm: