Jump to content
jncevcosta

Ajuda a resolver problema...

Recommended Posts

jncevcosta
O problema

A boa gestão de pessoal num quartel de bombeiros é crucial para garantir o melhor serviço possível à população em geral. Devido ao reduzido número de Homens por quartel, estes profissionais acumulam horas de trabalho que, no geral, são excessivamente cansativas, e raramente têm tempo suficiente para descansar entre cada evento a que são chamados a intervir.

Para tal foi-lhe atribuída a tarefa de proporcionar uma ferramenta de gestão de pessoal durante um dia de trabalho, com o objectivo de gerir o descanso dos bombeiro do quartel. A estratégia de gestão do descanso é muito simples e consiste em manter uma fila com os bombeiros aptos a trabalhar. Quando surge um novo evento, os primeiros bombeiros da fila são os chamados e associados à execução desse evento, deixando desse modo de constar na fila de livres. Quando o evento termina são novamente colocados na fila, passando novamente ao estado de aptos para serem chamados para novo evento. O uso de uma fila de bombeiros livres (ou aptos a responderem à chamada) garante ordem e sobretudo garante que os próximos a serem chamados serão os que estão em descanso há mais tempo.

Além do escalonamento de bombeiros para eventos que vão surgindo, a ferramenta deverá também fornecer estatísticas diárias, por exemplo, saber quais os eventos que aconteceram ao longo do dia, se houve algum evento em que não tenha havido bombeiros suficientes para o satisfazer, ou ainda saber em quantos eventos um bombeiro participou e quantas horas é que cada bombeiro esteve em ação.

Input

O input inclui informação sobre os bombeiros existentes no quartel e a simulação de ocorrência dos eventos. Os dados são apresentados da seguinte forma:

    A primeira linha contém o valor de uma flag (1, 2 ou 3) que determina o tipo de output a produzir.

    A segunda linha contém um inteiro nff, o número de bombeiros a considerar.

    Seguem-se nff linhas, cada uma com o nome de um bombeiro no quartel.

    Segue-se um número não determinado de linhas, cada uma com a informação sobre um evento. Existem três tipos de evento com a seguinte caracterização:

        uma string "PARTIDA", um inteiro com o identificador do evento, um inteiro com o número de bombeiros necessários para este evento e um inteiro a representar a hora de início do evento.

        Por simplicidade, a hora será dada em minutos contados a partir das 0 horas da manhã. Por exemplo, um evento com início às 5:20 terá uma hora de início igual a 320 minutos após as 0 horas.

        uma string "CHEGADA", identificador do evento e hora de fim do evento (também em minutos). É garantido que a hora de fim é estritamente maior que a hora de início para o mesmo evento.

        uma string "FIM", indicador do fim da sequência de eventos.

Notar que os eventos aparecem no input ordenados por hora, mas a ordem pelo qual terminam não é garantida, i.e. podemos ter eventos que começaram depois de outros e que terminam antes. Por exemplo, podemos ter uma sequência como a seguinte:

 

PARTIDA 1 3 620

PARTIDA 2 5 950

CHEGADA 1 860

PARTIDA 3 6 1000

CHEGADA 3 1050

CHEGADA 2 1230

FIM

Output

Se flag==1, deverá apresentar o número de eventos que ocorreram. O output deverá ser Ocorreram N eventos onde N é o valor calculado.

Se flag==2, deverá apresentar os nomes dos bombeiros destacados para cada evento. Numa primeira linha deve escrever a mensagem Bombeiros Destacados, seguindo-se para cada evento, uma linha com EVENTO N, em que N é o identificador do evento, e nas linhas seguintes os nomes de cada bombeiro destacado para o evento, um por linha. Se num dado evento não tiver sido destacado nenhum bombeiro, o output deverá ser a mensagem Nenhum.

Se flag==3, deverá apresentar uma listagem com todos os bombeiros. Numa primeira linha deve escrever a mensgem Listagem de Bombeiros, seguindo-se a informação de cada bombeiro, um por linha, mostrando-se o nome, o número de eventos em que participou, e o número de horas que trabalhou (dada em minutos). Se não trabalhou nenhuma hora, deve aparecer "0".

import java.util.*;
import java.io.*;
import java.lang.*;

class Bombeiro{
    String name;
    int n_eventos;
    int workHours;

    Bombeiro (String nome){
name = nome;
n_eventos=0;
workHours = 0;
    }
    public void actualizaBombeiro(int duracao){
n_eventos++;
workHours += duracao;
    }
}

class Evento{
    int id;
    int n_bombeiros; //numero de bombeiros
    int n_bombeiros_associados; //numero de bombeiros associados
    int hora_inicio;
    int hora_fim;
    Bombeiro bomb[];
    

    Evento(int idbomb, int nbomb, int start){
id = idbomb;
n_bombeiros = nbomb;
hora_inicio = start;
n_bombeiros_associados = 0;
hora_fim = 0;
bomb = new Bombeiro[n_bombeiros];

    }
    
    // Atribuir um bombeiro ao evento
    public void associarBombeiro(Bombeiro ff){
bomb[n_bombeiros_associados] = ff;
n_bombeiros_associados++;
    }

    //Escreve os bombeiros escalados por evento
    public void printBombeirosAssociados(){
for(int i = 0; i<n_bombeiros_associados; i++){
    System.out.println(bomb[i].name);
}   
    }

}

class Bombeiros{
    public static List<Bombeiro> livres = new List<Bombeiro>();
    public static List<Evento> eventos = new List<Evento>();

    public static Evento findEvent(int eventID) {
for (Evento ev: eventos)
    if (ev.id== eventID)
	return ev;

return null; 
    }

    public static void main (String args[]){
Scanner leitura = new Scanner (System.in);
int flag, n_bombeiros;
String action;
int neventos;
String nomebomb;
int contador = 0;


flag = leitura.nextInt();
n_bombeiros = leitura.nextInt();


for (int i = 0; i<n_bombeiros; i++){
    livres.addLast(leitura.next());
}

action = leitura.next();
while(!action.equals("FIM")){
    if (action.equals("PARTIDA")){
	Evento novo = new Evento(leitura.nextInt(), leitura.nextInt(), leitura.nextInt());
	eventos.addLast(novo);
	contador++;
	for(int i = 0; i<novo.n_bombeiros && !livres.isEmpty(); i++){
	    novo.associarBombeiro(livres.removeFirst());
	}
    }

    if(action.equals("CHEGADA")){
	Evento novo = findEvent(leitura.nextInt());
	novo.hora_fim = leitura.nextInt();
	for (int i = 0; i<novo.n_bombeiros_associados; i++){
	    novo.bomb[i].actualizaBombeiro(novo.hora_fim - novo.hora_inicio);
	    livres.addLast(novo.bomb[i]);
	}
    }
    action=leitura.next();
}
if (flag == 1){
    System.out.println("Ocorreram "+contador+" eventos");
}
if (flag == 2){
    System.out.println("Bombeiros Destacados");
    for(int i = 1; i<=contador; i++){
	System.out.println("EVENTO "+i);
	Evento novo = findEvent(i);
	for(int j = 0; j<novo.n_bombeiros_associados; j++){
	    System.out.println(novo.bomb[j].name);
	}
    }
}
if(flag == 3){
    System.out.println("Bombeiros Destacados");
    for (int i = 0; i<n_bombeiros; i++){
	Bombeiro novo = livres.removeFirst();
	System.out.println(novo.name+" "+novo.n_eventos+" "+novo.workHours);
    }
}
    }
}



class List<E> implements Iterable<E> {
    private int size;
    private Node first;
    private Node last;

    public boolean isEmpty() {return size == 0;}
    public int size() {return size;}

    // construtor de lista vazia
    List() {
        size = 0;
        first = last = null;
    }
    // remove primeiro elemento da lista
    public E removeFirst() {

    }
    // adiciona no fim da lista
    public void addLast(E v) {

    }
    // um no da lista
    private class Node {
E val;
Node next;

Node(E v, Node n) {
    val = v;
    next = n;
}
    }
    // metodo iterador, devolve um objecto ListIterator 
    public Iterator<E> iterator() {
return new ListIterator();
    }
    // definicao de iteradores sobre os elementos da lista
    private class ListIterator implements Iterator<E> {
Node current = first;

public boolean hasNext() {return current != null;}
public void remove() {
    throw new UnsupportedOperationException();
}
public E next() {
    if (!hasNext()) throw new NoSuchElementException();
    E v = current.val;
    current = current.next;
    return v;
}
    }
}

Coloquei em cima o enunciado do problema e em baixo a minha resolução.

Acontece que estou a obter o seguinte erro quando tento compilar:

javac bombeiros.java

bombeiros.java:81: addLast(Bombeiro) in List<Bombeiro> cannot be applied to (java.lang.String)

    livres.addLast(leitura.next());

          ^

1 error

Alguém me sabe dizer o porque?

Outra dúvida, no fundo do código o prof pediu para acrescentarmos a class List, só que parece-me que falta parte do código na addLast e removeFirst, certo?

O que é suposto colocar lá?

Qualquer ajuda é bem vinda.

Obrigado

jncevcosta

Share this post


Link to post
Share on other sites
Baderous
addLast espera um Bombeiro como argumento e estás a passar String.

Share this post


Link to post
Share on other sites
blackburn69

Boa noite.

O que queres fazer nesse sítio (e noutros em que a lógica seja a mesma) é usar o construtor que definiste:

livres.addLast(new Bombeiro(leitura.next()));

Share this post


Link to post
Share on other sites
jncevcosta

Boa noite.

O que queres fazer nesse sítio (e noutros em que a lógica seja a mesma) é usar o construtor que definiste:

livres.addLast(new Bombeiro(leitura.next()));

Obrigado... Não estava a conseguir perceber a lógica... Mas realmente era bastante simples... :)

Relativamente à minha segunda questão alguém  me pode ajudar? ;)

Mais uma vez obrigado pela ajuda. :)

Share this post


Link to post
Share on other sites
jncevcosta

Alguém me consegue ajudar na parte do completar o removeFirst e no addLast?

Cumps

Share this post


Link to post
Share on other sites
Baderous

Nesses métodos é uma questão de alterar o valor apontado por first, last e incrementar/decrementar o size, é como se estivesses a trabalhar com listas ligadas em C.

Share this post


Link to post
Share on other sites
jncevcosta

Nesses métodos é uma questão de alterar o valor apontado por first, last e incrementar/decrementar o size, é como se estivesses a trabalhar com listas ligadas em C.

Só que eu nunca trabalhei com C... :thumbsup:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.