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:
Solo al que me haya leido le doy las gracias, estoy realmente pillado con este ejercicio :S /* * 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); } }