Programação Competitiva

Alarme Despertador [Maratona 2009]

Daniela é enfermeira em um grande hospital, e tem os horários de trabalho muito variáveis. Para piorar, ela tem sono pesado, e uma grande dificuldade para acordar com relógios despertadores.

Recentemente ela ganhou de presente um relógio digital, com alarme com vários tons, e tem esperança que isso resolva o seu problema. No entanto, ela anda muito cansada e quer aproveitar cada momento de descanso. Por isso, carrega seu relógio digital despertador para todos os lugares, e sempre que tem um tempo de descanso procura dormir, programando o alarme despertador para a hora em que tem que acordar. No entanto, com tanta ansiedade para dormir, acaba tendo dificuldades para adormecer e aproveitar o descanso.

Um problema que a tem atormentado na hora de dormir é saber quantos minutos ela teria de sono se adormecesse imediatamente e acordasse somente quando o despertador tocasse. Mas ela realmente não é muito boa com números, e pediu sua ajuda para escrever um programa que, dada a hora corrente e a hora do alarme, determine o número de minutos que ela poderia dormir.

Entrada

A entrada contém vários casos de teste. Cada caso de teste é descrito em uma linha, contendo quatro números inteiros H1, M1, H2 e M2, com H1:M1 representando a hora e minuto atuais, e H2:M2 representando a hora e minuto para os quais o alarme despertador foi programado (0≤H1≤23, 0≤M1≤59, 0≤H2≤23, 0≤M2 ≤59).

O final da entrada é indicado por uma linha que contém apenas quatro zeros, separados por espaços em branco.

Saída

Para cada caso de teste da entrada seu programa deve imprimir uma linha, cada uma contendo um número inteiro, indicando o número de minutos que Daniela tem para dormir.

O resultado de seu programa deve ser escrito na saída padrão.

Exemplo

EntradaSaída
1 5 3 5
23 59 0 34
21 33 21 10
0 0 0 0
120
35
1417

Dica

O primeiro passo consiste em transformar cada hora em minutos e contabilizar os minutos totais. Se o momento atual (primeiro horário) for menor do que o programado (segundo horário), a resposta será a diferença entre o programado e o atual. Caso contrário, além da diferença anterior, será necessário adicionar a quantidade de minutos do 1 dia (24*60 = 1440).

Solução em C/C++

#include <stdio.h>

int main () {
    int h1, h2, m1, m2, t1, t2;
 
    while (1) { //repete infinitamente
    	scanf ("%i %i %i %i", &h1, &m1, &h2, &m2);
    	
    	if (h1==0 && h2==0 && m1==0 && m2==0) { 
    		break; //para o while caso valores zero sejam fornecidos na entrada
    	}
        
        t1 = (h1 * 60) + m1;
        t2 = (h2 * 60) + m2;
         
        if (t1 < t2) {
        	printf ("%i\n", t2-t1);
        } else {
        	printf ("%i\n", 1440+(t2-t1)); //24*60 = 1440
        }
    }
 
    return 0;
}

Teste o código: http://ideone.com/9dVEYd

Solução em Python

while True:
    #leitura dos 4 valores
    h1 = int(input())
    m1 = int(input())
    h2 = int(input())
    m2 = int(input())
    
    #testa condição de parada
    if h1==0 and h2==0 and m1==0 and m2==0:
        break
    
    t1 = (h1 * 60) + m1;
    t2 = (h2 * 60) + m2;
         
    if t1 < t2:
        print t2-t1
    else:
        print 1440+(t2-t1) #24*60 = 1440

Teste o código: http://www.codeskulptor.org/#user42_yY9aclqqC3_0.py

Embora o algoritmo na função main() seja funcional para as linguagens de programação C e C++, segue abaixo a codificação específica para a linguagem C++ (a solução foi inspirada a partir do comentário feito por Luis Henrique Veiga Amarante).

#include <iostream>

using namespace std;

int main()
{
    int hora_dormir, minuto_dormir, hora_acordar, minuto_acordar, acorda_caraio, mi, ho;

    /* mi – representa os minutos de sono
    ho – representa as horas de sono*/

    while (1) {
        cin >> hora_dormir;
        cin >> minuto_dormir;
        cin >> hora_acordar;
        cin >> minuto_acordar;

        if (hora_acordar ==00 && hora_dormir ==0 && minuto_acordar ==00 && minuto_dormir ==00)     {
            return 0;
        }

        ho = (hora_dormir * 60) + minuto_dormir;
        mi = (hora_acordar * 60) + minuto_acordar;

        if ( ho < mi) {
            cout << mi - ho << endl;
        } else {
            cout << 1440 + (mi - ho) << endl;
        }
    }
    return 0;
}
Sair da versão mobile