Guenas.
Creo que te complicas mucho la vida.
Muchas funciones, recursividad, etc.
Creo que puedes obtener el resultado optimo con dos simples bucles anidados.
El bucle superior cuenta la altura desde la que empiezas a talar, empezando por la altura del árbol mas alto menos 1 y reduciéndose 1 en cada pasada.
Dentro de este bucle pones otro que pateando todos los arboles calcule la madera obtenida al cortar a la altura.
Cuando la madera obtenida sea mayor o igual que la solicitada sales de los bucles dando como resultado la altura que marca el bucle superior.
Un saludo
ueno 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 este error en ejecución:
Exception in thread "main" java.lang.StackOverflowError
Y me da en el método demasiadoalto. El algoritmo no es tanto en verdad, les ruego que le echen un vistazo.
Pienso que el problema podría estar en los procesos demasiadoalto y demasiadobajo pero no le veo el fallo :S
Una cosa sí, el programa me compila bien
/*
* 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 sumactual){
sumactual=sumactual/2;
alturacorte = alturacorte-sumactual;
if (maderapedida != maderarecolecta(demasiadoalto,alturacorte)){
if (maderapedida < maderarecolecta(demasiadoalto,alturacorte)) alturacorte=demasiadoalto(demasiadoalto,alturacorte,maderapedida,sumactual);
else if (maderapedida > maderarecolecta(demasiadoalto,alturacorte)) alturacorte=demasiadobajo(demasiadoalto,alturacorte,maderapedida,sumactual);
}
return alturacorte;
}
public static int demasiadobajo(int[] demasiadobajo, int alturacorte, int maderapedida, int sumactual){
sumactual = sumactual/2;
alturacorte = alturacorte+sumactual;
if (maderapedida != maderarecolecta(demasiadobajo,alturacorte)){
if ((sumactual/2)!=0){
if (maderapedida > maderarecolecta(demasiadobajo,alturacorte)) alturacorte=demasiadobajo(demasiadobajo,alturacorte,maderapedida,sumactual);
else if (maderapedida < maderarecolecta(demasiadobajo,alturacorte)) alturacorte=demasiadoalto(demasiadobajo,alturacorte,maderapedida,sumactual);
}
}
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,alturamaxima);
System.out.print(alturaideal);
}
}
Solo al que me haya leido le doy las gracias, estoy realmente pillado con este ejercicio :S