Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] ¿Cómo hago este algoritmo?

Estas en el tema de ¿Cómo hago este algoritmo? en el foro de Java en Foros del Web. Bueno primero que nada no soy nada más que un novato en java, pero me estoy intentando poner las pilas... Llevo bastante liado con este ...
  #1 (permalink)  
Antiguo 27/03/2014, 13:41
 
Fecha de Ingreso: mayo-2008
Mensajes: 37
Antigüedad: 16 años
Puntos: 5
¿Cómo hago este algoritmo?

Bueno primero que nada no soy nada más que un novato en java, pero me estoy intentando poner las pilas... Llevo bastante liado con este ejercicio pero no soy capaz de terminarlo, lo siento si es demasiado y entenderé si no queréis ayudarme, aunque seguro que no es nada para vosotros. Vamos con el ejercicio:

Se supone una maquina que tala arboles de una manera peculiar, se posiciona en una altura h y en esa altura h tala toda la leña de los árboles que se encuentre por encima de esa posición.

Por ejemplo, tenemos un árbol 16 y un árbol 20

Si cortamos a altura 15 cortaríamos 1 unidad del árbol 1 y 5 unidades del árbol 2, 6 unidades en total, no se si me explico

Bueno tengo que conseguir que metiendo por teclado la cantidad de árboles, la madera deseada, y las medidas de cada árbol se me devuelva la altura a la que se debería cortar para conseguir esa cantidad de madera. En caso de no poder hallar una solución inmediata, nos quedaríamos con la inmediata superior.

Hay que usar el método decrementa y vencerás

He aqui un ejemplo resuelto
4 árboles
7 unidades de madera deseadas
20 mide el árbol 1
15 mide el árbol 2
10 mide el árbol 3
17 mide el árbol 4

La salida sería 15, ya que 20-15+17-15+0+0=7

Mirad, llevo todo esto escrito, tengo estos dos errores en ejecución:
Exception in thread "main" java.lang.StackOverflowError
at practica.daa.PracticaDaa.demasiadoalto(PracticaDaa .java:27)
at practica.daa.PracticaDaa.demasiadoalto(PracticaDaa .java:30) (este segundo repetido cientos de veces)

Una cosa sí, el programa me compila bien

Aquí está el programa:
Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package practica.daa;

import java.util.*;

/**
 *
 * @author Alberto
 */
public class PracticaDaa {
    /**

     */
    public static int maderarecolecta (int[] maderarecolecta, int alturacorte){
      int maderatotal = 0;
        for (int i=0;i<maderarecolecta.length;i++) {           
            if (maderarecolecta[i]-alturacorte>0) maderatotal = maderatotal + maderarecolecta[i] - alturacorte; 
        }
         return maderatotal;
    }
    public static int demasiadoalto(int[] demasiadoalto, int alturacorte, int maderapedida, int liminf){
    int limsup = alturacorte;// linea 26
    alturacorte = alturacorte-(alturacorte-liminf)/2;
    if (maderapedida != maderarecolecta(demasiadoalto,alturacorte)){
    if (maderapedida < maderarecolecta(demasiadoalto,alturacorte))//linea 30
 alturacorte=demasiadoalto(demasiadoalto,alturacorte,maderapedida,liminf);
    else if (maderapedida > maderarecolecta(demasiadoalto,alturacorte)) alturacorte=demasiadobajo(demasiadoalto,alturacorte,maderapedida,limsup);    
    }
    
    return alturacorte;
    };
    
    
            
    public static int demasiadobajo(int[] demasiadobajo, int alturacorte, int maderapedida, int limsup){
    int liminf = alturacorte;
    alturacorte = alturacorte+(limsup-alturacorte)/2;
    if (maderapedida != maderarecolecta(demasiadobajo,alturacorte)){
       if (limsup-alturacorte!=1){
        if (maderapedida > maderarecolecta(demasiadobajo,alturacorte)) alturacorte=demasiadobajo(demasiadobajo,alturacorte,maderapedida,limsup);
        else if (maderapedida < maderarecolecta(demasiadobajo,alturacorte)) alturacorte=demasiadoalto(demasiadobajo,alturacorte,maderapedida,liminf);
   }
    }
        return alturacorte;}

    public static int Maximaaltura ( int [] maximo) {
        int alturarbol;
        alturarbol=maximo[0];
        
        for (int i=0;i<maximo.length;i++) {           
            if (alturarbol<maximo[i]) alturarbol=maximo[i];  
        }
        
        return alturarbol;
        
    }
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner lector = new Scanner(System.in);
        int i;
        int n = lector.nextInt();        
        int cantidadmadera = lector.nextInt();
        int[] bosque = new int[n];
        for(i = 0;i<n;i++) {
     String leerarbolaux = lector.next();
     bosque[i] = Integer.parseInt(leerarbolaux);
        }
       int alturamaxima;
       alturamaxima = Maximaaltura(bosque);
       int alturaideal;
       alturaideal = demasiadoalto(bosque,alturamaxima,cantidadmadera,0);
       System.out.print(alturaideal);
    }
    
}
Solo al que me haya leido le doy las gracias, estoy realmente pillado con este ejercicio :S
  #2 (permalink)  
Antiguo 28/03/2014, 05:56
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: ¿Cómo hago este algoritmo?

Hola

Ese error se debe a que entras en un bucle infinito y excedes la memoria

Código Java:
Ver original
  1. public static int demasiadoalto(int[] demasiadoalto, int alturacorte, int maderapedida, int liminf){
  2.         int limsup = alturacorte;// linea 26
  3.         alturacorte = alturacorte-(alturacorte-liminf)/2;
  4.         if (maderapedida != maderarecolecta(demasiadoalto,alturacorte)){
  5.             if (maderapedida < maderarecolecta(demasiadoalto,alturacorte))//linea 30
  6.                 alturacorte=demasiadoalto(demasiadoalto,alturacorte,maderapedida,liminf);
  7.             else if (maderapedida > maderarecolecta(demasiadoalto,alturacorte))
  8.                 alturacorte=demasiadobajo(demasiadoalto,alturacorte,maderapedida,limsup);    
  9.         }
  10.        
  11.         return alturacorte;
  12.         };

si te fijas "maderapedida" siempre tiene el mismo valor, por lo tanto llamas una y otra vez al método demasiadoalto
  #3 (permalink)  
Antiguo 28/03/2014, 09:10
 
Fecha de Ingreso: mayo-2008
Mensajes: 37
Antigüedad: 16 años
Puntos: 5
Respuesta: ¿Cómo hago este algoritmo?

Ya pero alturacorte=demasiadoalto(demasiadoalto,alturacort e,maderapedida,sumactual); en teoría va bajando cada vez que lo ejecuto, ya que le resto sumactual, y así sería hasta que fuese mayor en vez de menor, no?

Está claro que es un bucle infinito pero no veo como arreglarlo
  #4 (permalink)  
Antiguo 28/03/2014, 09:16
 
Fecha de Ingreso: mayo-2008
Mensajes: 37
Antigüedad: 16 años
Puntos: 5
Respuesta: ¿Cómo hago este algoritmo?

Pido perdon por mi inutilidad, he visto el fallo, donde pongo esto

<code> if (maderapedida < maderarecolecta(demasiadoalto,alturacorte))//linea 30
alturacorte=demasiadoalto(demasiadoalto,alturacort e,maderapedida,liminf);
else if (maderapedida > maderarecolecta(demasiadoalto,alturacorte))
alturacorte=demasiadobajo(demasiadoalto,alturacort e,maderapedida,limsup); </code>

en verdad necesitaba esto
<code> if (maderapedida > maderarecolecta(demasiadoalto,alturacorte))//linea 30
alturacorte=demasiadoalto(demasiadoalto,alturacort e,maderapedida,liminf);
else if (maderapedida < maderarecolecta(demasiadoalto,alturacorte))
alturacorte=demasiadobajo(demasiadoalto,alturacort e,maderapedida,limsup);
</code>

Y efectivamente por eso se ejecutaba infinitas veces.

Voy a hacer unas cuantas comprobaciones y lo marco cómo resuelto, pero tiene buena pinta de momento

Etiquetas: programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:10.