viernes, 11 de abril de 2014

Programame Ourense 2014 Presupuestos con objetos y arrayList

H - Presupuestos

Un compañero de Frenando, un tal, Kimi Cuentas se ha propuesto reformar una casa para dedicarla a turismo rural, pero tiene unas fuertes restricciones presupuestarias y temporales por lo que se ha dedicado a solicitar presupuestos a distintas empresas haciendo especial hincapié en que las empresas desglosaran las tareas en una serie de grupos a los que ha asignado una inicial:
O - OTROS
C - CARPINTERÍA
A - ALBAÑILERÍA
F - FONTANERÍA
R - CRISTALERÍA
E - ELECTRICIDAD
Frenando le ha implementado un programa que le permita escoger el mejor presupuesto.
En cada presupuesto puede haber categorías duplicadas o inexistentes, en caso de una categoría duplicada nos quedaremos con el mejor precio de esa categoría.
Para los cálculos se entiende que todos los precios son pvp, el número de horas y coste por hora no puede ser cero aunque si el de los materiales (tampoco existirán valores negativos).

Entrada

En la primera línea aparecerá el nombre de la empresa y a continuación y a razón de una tarea por línea:
CATEGORÍA – NÚMERO DE HORAS – COSTE POR HORA – COSTE DE LOS MATERIALES
Para indicar el fin de las líneas de un presupuesto se introducirá una línea en la que las horas, el coste por hora y los materiales tengan todos valor 0.
El programa terminará cuando encuentre como nombre de empresa la palabra FIN.

Salida

Nombre de la empresa que ha realizado el presupuesto menor seguido del número de horas que tardará en ejecutar la reforma.
En caso de haber dos presupuestos de igual precio mostrará el de menor duración y si aún así persistiera la igualdad el que lo hubiera enviado con antelación teniendo en cuenta que los presupuestos son introducidos en el programa por estricto orden de llegada.

Entrada de ejemplo

Los rapidos
A 100 30 200
A 200 25 0
F 10 1 100
O 0 0 0
Los lentos
A 1000 3 200
A 200 25 0
F 10 1 100
A 0 0 0
FIN
Programa-Me 2014
Regional Online - Ourense

Salida de ejemplo

Los rapidos 110

package h.presupuestos;
import java.util.Scanner;
import java.util.ArrayList;

public class HPresupuestos {

  
    public static void main(String[] args) {
       Scanner leo = new Scanner(System.in);
       String linea;
       String palabras [];
       Categoria leida;
       Empresa empGana,empActual;
      
        empGana= new Empresa();
        linea=leo.nextLine();
        while (!linea.equalsIgnoreCase("FIN")) {
            empActual = new Empresa(linea);
            linea=leo.nextLine();
            palabras=linea.split(" ");
            while (!(palabras[1].equals("0") && palabras[2].equals("0") && palabras[3].equals("0"))) {
                leida= new Categoria(palabras[0].charAt(0),Double.parseDouble(palabras[1]),Double.parseDouble(palabras[2]),Double.parseDouble(palabras[3]));
                empActual.pushCategoria(leida);
                linea=leo.nextLine();
                palabras=linea.split(" ");
            }
            if ((empGana.nombre.equals("primera") || empActual.getPresupuesto()<empGana.getPresupuesto()) ||(empActual.getPresupuesto()==empGana.getPresupuesto()&&empActual.getHoras()<empGana.getHoras()))
            {
               empGana=empActual;
               
            }
           
           
            linea=leo.nextLine();
        }
        System.out.println(empGana.nombre+" "+Math.round(empGana.getHoras()));
      
      
      
      
    }
}






class Categoria{
    private char letra;
    private double precio;
    private double horas;

    public Categoria(char letra,double horas,double precioHora,double materiales) {
        this.letra = letra;
        this.horas=horas;
        this.precio = calcularPrecio(horas,precioHora,materiales);
       
    }

    public double getHoras() {
        return horas;
    }
   
    private double calcularPrecio(double horas,double precioHora,double materiales)
    {
       return ((horas*precioHora)+materiales);
    }

    public char getLetra() {
        return letra;
    }

    public void setLetra(char letra) {
        this.letra = letra;
    }

    public double getPrecio() {
        return precio;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj==null) {
            return false;
        }
        if (obj instanceof Categoria){
            Categoria elotro = (Categoria) obj;
            return elotro.getLetra()==letra;
        }
        else return false;
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    public void setHoras(double horas) {
        this.horas = horas;
    }

    public void setPrecio(double precio) {
        this.precio = precio;
    }
   
   
   

   
}

class Empresa{
    public String nombre;
    ArrayList<Categoria> tareas;

    public Empresa(String nombre) {
        this.nombre = nombre;
        tareas = new ArrayList<>();
    }

    public Empresa() {
        nombre="primera";
       
    }
   
    public void pushCategoria(Categoria una){
        int pos;
       
        pos= tareas.indexOf(una);
        if (pos==-1) tareas.add(una);
        else {
            if ( tareas.get(pos).getPrecio()>una.getPrecio() || (tareas.get(pos).getPrecio()==una.getPrecio() && tareas.get(pos).getHoras()>una.getHoras()) ){
               // tareas.remove(pos);
               // tareas.add(una);
                tareas.get(pos).setHoras(una.getHoras());
                tareas.get(pos).setPrecio(una.getPrecio());
            }
        }
       
      
    }
    public double getHoras(){
       double total=0;
               
        for (Categoria categoria : tareas) {
            total+=categoria.getHoras();
        }
        return total;
    }
    public double getPresupuesto(){
        double total=0;
               
        for (Categoria categoria : tareas) {
            total+=categoria.getPrecio();
        }
        return total;
       
       
    }
}