[ED098] Triagem de Manchester

Neste problema deverá submeter uma classe ED098 contendo um programa completo para resolver o problema (ou seja, com o método main).
Pode assumir que no Mooshak terá acesso às classes de listas, pilhas e filas como dadas nas aulas (ou seja, não precisa de as incluir no código submetido).


Introdução

As urgências hospitalares existem para o atendimento rápido das situações de risco para a saúde, pelo que é claro que quanto mais grave a situação clínica mais rapidamente os pacientes devem ser atendidos. O Sistema de Triagem de Manchester utiliza um protocolo clínico que permite classificar a gravidade da situação de cada doente que recorre ao Serviço de Urgência. Este método permite uma rápida identificação dos doentes permitindo atender, em primeiro lugar, os doentes mais graves e não, necessariamente, quem chega primeiro.

Após efetuar a sua inscrição na Admissão de Doentes será encaminhado para o gabinete de triagem, onde será submetido a uma observação prévia, com identificação de um conjunto de sintomas ou de sinais que permitem atribuir uma cor que corresponde a um grau de prioridade clínica no atendimento e a um tempo de espera recomendado, até à primeira observação médica. Existem 5 cores, vermelho, laranja, amarelo, verde e azul, cada uma representando um grau de gravidade e um tempo de espera recomendado para o doente ser submetido a observação médica. A tabela seguinte faz o resumo das cores:

Cor Situação
VermelhoEmergente
LaranjaMuito Urgente
AmareloUrgente
VerdePouco Urgente
AzulNão Urgente

Decorrente do contacto inicial no gabinete de triagem, o doente é identificado com uma cor, representando um grau de gravidade e um tempo de espera recomendado para atendimento. Aos doentes com patologias mais graves é atribuída a cor vermelha, que corresponde a um atendimento imediato. Os casos muito urgentes recebem a cor laranja, com um tempo de espera recomendado de 10 minutos. Os casos urgentes, com a cor amarela, têm um tempo de espera recomendado de 60 minutos. Os doentes que recebem a cor verde e azul são casos de menor gravidade (pouco ou não urgentes) que, como tal, devem ser atendidos no espaço de duas e quatro horas, respetivamente, após atendimento dos doentes mais graves.

O problema

A sua tarefa é criar uma ferramenta informática que permita gerir o atendimento dos pacientes numa urgência, escolhendo quem é atendido primeiro e gerando estatísticas acerca dos tempos de espera resultantes.

Tem disponível uma lista de todos os doentes que chegam à urgência, na ordem da sua chegada. Para cada doente sabe o resultado de triagem (uma cor: Vermelho, Laranja, Amarelo, Verde ou Azul), o tempo de chegada ao hospital, e o tempo que o seu atendimento demorará. A ordem para doentes da mesma cor é garantida pelo tempo de chegada à triagem, o que corresponde a dizer que existe uma fila associada a cada cor.

Considere que a urgência possui N equipas de urgência (numeradas de 0 a N-1), sendo que cada uma delas pode estar num dado momento a atender um único doente. Sempre que uma equipa de urgência está livre, as filas de espera são consultadas. Se não houver nenhum doente, a equipa espera que chegue alguém. Caso haja pelo menos um doente, é atendido o que estiver na frente de uma fila com maior grau de urgência. Quando todos os doentes tiverem sido atendidos, o programa deve terminar.

No início todas as equipas estão livres. No minuto em que uma equipa termina um atendimento, pode começar logo a atender outro paciente. Se existir mais do que uma equipa livre para atender um dado paciente, deve escolher primeiro a que está livre há mais tempo (e em caso de empate a que tenha um número de identificação menor).

Input

A primeira linha do input contém o valor de uma flag (0, 1, ou 2) que determina o tipo de resultados que pretendemos observar. Segue-se uma linha com um inteiro N (1 ≤ N ≤ 5), o número de equipas a fazer atendimento na urgência.

As linhas seguintes, em número indeterminado, fornecem informação dos doentes, na ordem em que que chegam às urgências. Cada linha possui uma string (sem espaços) com o nome do doente, seguida da cor que lhe foi atribuida na triagem ("Vermelho", "Laranja", "Amarelo", "Verde" ou "Azul"), de um inteiro Tchegada com o tempo de chegada em minutos ao hospital (0 ≤ Tchegada ≤ 1440), e de um inteiro com o tempo que demorará o atendimento do doente.

Pode assumir que no input os doentes vêm por ordem crescente do tempo de chegada (mas podem existir tempos de chegada iguais). É também garantido que não terá mais do que 1500 doentes para processar, e que o número de pacientes com a mesma cor é inferior a 1000.

Output

(25 pontos) Se flag==0, deverá apresentar o número de pacientes que chegaram às urgências durante o dia a que se reporta o input, divididos por prioridade. O output deverá ser uma sequência de 5 linhas, cada uma com uma string com o nome da cor, seguida de um inteiro com o número de pacientes com essa cor. No final deverá escrever qual o total de doentes atendidos (nesta flag, o número de equipas de atendimento indicado no input não é relevante).

(35 pontos) Se flag==1 deverá apresentar a sequência em que os doentes foram atendidos durante esse dia. Para tal, apresente uma linha por doente, ordenada pela ordem de atendimento. Cada linha deverá ter uma string com o nome do doente, seguida de um inteiro com o tempo de chegada ao hospital, um inteiro com o tempo de espera até à entrada num posto de atendimento, e um inteiro com o tempo de saída do Hospital. No final deverá apresentar o tempo médio de espera para ser atendido (tempo médio em minutos de espera dos doentes). Nesta flag, o número de equipas de atendimento dado no input será sempre 1, o que simplifica muito a tomada de decisão sobre o atendimento.

(40 pontos) No caso de se ter flag==2, o número de equipas dado no input é um valor de 2 a 5, obrigando a cuidados na tomada de decisão sobre quem faz o atendimento. Neste caso deverá apresentar:

Veja os exemplos de output para perceber os cabeçalhos e formatos de escrita pretendidos.

Exemplos:

Input

Output

0
2
MiguelCoimbra Laranja 0 20
RitaRibeiro Verde 0 5
FernandoSilva Amarelo 5 15
------------
Cores     ND
------------
Vermelho   0
 Laranja   1
 Amarelo   1
   Verde   1
    Azul   0
------------
Numero doentes atendidos: 3

Input

Output

1
1
MiguelCoimbra Laranja 0 20
RitaRibeiro Verde 0 5
FernandoSilva Amarelo 5 15
---------------------------
Lista dos doentes atendidos
---------------------------
MiguelCoimbra 0 0 20
FernandoSilva 5 15 35
RitaRibeiro 0 35 40
---------------------------
Tempo medio de espera: 16.7

Input

Output

2
2
MiguelCoimbra Laranja 0 20
RitaRibeiro Verde 0 5
FernandoSilva Amarelo 5 15
-----------------------
Equipa NDoentes MediaTA
-----------------------
     0        1    20.0
     1        2    10.0
---------------------------
Lista dos doentes atendidos
---------------------------
MiguelCoimbra 0 0 20
RitaRibeiro 0 0 5
FernandoSilva 5 0 20
---------------------------
Tempo medio de espera: 0.0

Última actualização:
Adaptado do enunciado original de Fernando Silva (DCC/FCUP)