Vovô João tem uma banca de jornais; ele tem muitos clientes, e diariamente recebe muito dinheiro, mas também faz muitos pagamentos para manter o seu estoque de jornais e revistas. Todo dia ele vai ao banco realizar um depósito ou uma retirada de dinheiro. Em alguns dias, o saldo de sua conta no banco pode ficar negativo, mas Vovô João não é penalizado por isso. Dada a movimentação diária da conta do banco do Vovô João, você deve escrever um programa que calcule o menor saldo da conta, no período dado. O Saldo inicial também deve ser levado em consideração.
Escreva um subprograma principal que recebe na primeira linha da entrada dois números inteiros N e S que indicam respectivamente o número de dias do período de interesse e o saldo da conta no início do período. Cada uma das N linhas seguintes contém um número inteiro indicando a movimentação de um dia (valor positivo no caso de depósito, valor negativo no caso de retirada). A movimentação é dada para um período de N dias consecutivos: a primeira das N linhas corresponde ao primeiro dia do período de interesse, a segunda linha corresponde ao segundo dia, e assim por diante. As N movimentações devem ser armazenadas em um vetor.
Seu programa deverá ter uma função que retorna o menor saldo da conta do vovô. A saída será dada em uma linha, contendo um número inteiro que corresponde ao menor valor de saldo da conta no período dado.
Obs.: Vetores em Python são implementados como listas cujos elementos são todos homogêneos.
Entradas:
- Dois números inteiros que indicam o número de dias no período de interesse e o saldo da conta no início do periodo.
- N linhas seguintes contendo um número inteiro indicando a movimentação de um dia (valor positivo no caso de depósito, valor negativo no caso de retirada). Esses valores deverão ser armazenados em um vetor.
Saídas:
- Um número inteiro que corresponde ao menor valor de saldo da conta no período dado.
Exemplo de Entrada:
31000
100
-800
50
Exemplo de Saída:
300
Entradas:
100
-800
50
Passo 1
O que o enunciado pede e o que é dado.
- Dados:
- Um inteiro
: número de dias do período de interesse. - Um inteiro
: saldo da conta no início do período (saldo inicial). - Uma sequência de
inteiros : cada é a movimentação do dia (depósito se positivo, retirada se negativo). Essas movimentações devem ser armazenadas em um vetor (lista).
- Um inteiro
- Pedido:
- Escrever um subprograma (função) que receba os valores acima e retorne o menor saldo da conta observado durante o período, levando em conta o saldo inicial.
- Observação: a cada dia o saldo é atualizado somando a movimentação daquele dia ao saldo do dia anterior; o saldo pode ficar negativo e isso não gera penalidade. Queremos o menor valor (mínimo) entre todos os saldos do período, incluindo o saldo inicial.
Passo 2
Ideia matemática/algorítmica que resolve o problema (explicação didática e fórmula).
- Definição de saldos por dia:
- Saldo inicial:
. - Para cada dia
, o saldo ao final do dia é
Aqui representa o saldo depois de aplicar a movimentação do dia , e é a movimentação do dia . - Saldo inicial:
- Objetivo: calcular
Ou seja, o menor saldo entre o saldo inicial e todos os saldos após cada movimentação. - Intuição simples: começamos com
. Vamos percorrer as movimentações até , atualizando um acumulador com e mantendo outro valor que guarda o menor saldo encontrado até o momento. No final é a resposta.
Passo 3
Passo a passo do algoritmo em palavras (como montar o programa na prova, sem pular etapas).
- Ler os inteiros
e . - Criar um vetor (lista) para armazenar as
movimentações: . - Inicializar duas variáveis:
-
(saldo corrente). -
(menor saldo observado até agora).
-
- Para cada
de até : - Ler
e armazenar no vetor. - Atualizar o saldo corrente:
. - Se
, então .
- Ler
- Ao final do loop,
contém o menor saldo de todo o período. Imprimir .
Observações práticas:
- Mesmo que tecnicamente dê para não guardar todas as movimentações (processar em streaming), o enunciado exige que as
movimentações sejam armazenadas em um vetor. Então armazene-as — mas ainda assim use o laço para calcular os saldos. - Variáveis explicadas:
-
: número de dias (inteiro). -
: saldo inicial (inteiro). -
: movimentação do dia (inteiro). -
: saldo corrente ao processar as movimentações. -
: menor saldo encontrado.
-
Passo 4
Complexidade e cuidados (o que observar na prova e no código).
- Complexidade de tempo: o algoritmo percorre as
movimentações uma vez, logo tem custo . - Complexidade de memória: armazena
inteiros no vetor, então de memória — isto respeita a exigência do enunciado. - Casos limites a checar:
-
: não há movimentações; o menor saldo é simplesmente . - Movimentações que levam a valores muito negativos: usar tipo inteiro que suporte o range do problema (em Python int é ilimitado).
-
- Erros comuns na prova: esquecer de comparar o saldo inicial
com os saldos posteriores; inicializar indevidamente.
Passo 5
Exemplo de implementação em Python (função pedida + programa principal). Este é o jeito que eu implementaria na prova/parte prática.
def menor_saldo(movimentos, S):
“”"
Recebe:
- movimentos: lista com N inteiros [m_1, …, m_N]
- S: saldo inicial (inteiro)
Retorna:
- menor saldo observado (inteiro)
“”"
B = S # saldo corrente
M = S # menor saldo observado
for m in movimentos:
B += m
if B < M:
M = B
return M
“”"
Recebe:
- movimentos: lista com N inteiros [m_1, …, m_N]
- S: saldo inicial (inteiro)
Retorna:
- menor saldo observado (inteiro)
“”"
B = S # saldo corrente
M = S # menor saldo observado
for m in movimentos:
B += m
if B < M:
M = B
return M
Programa principal (leitura e escrita)
Ler N e S na mesma linha ou em linhas separadas conforme a entrada
entrada = input().strip().split()
if len(entrada) == 2:
N = int(entrada[0])
S = int(entrada[1])
else:
# se vierem em linhas diferentes
N = int(entrada[0])
S = int(input().strip())
if len(entrada) == 2:
N = int(entrada[0])
S = int(entrada[1])
else:
# se vierem em linhas diferentes
N = int(entrada[0])
S = int(input().strip())
movimentos = []
for _ in range(N):
m = int(input().strip())
movimentos.append(m)
for _ in range(N):
m = int(input().strip())
movimentos.append(m)
resultado = menor_saldo(movimentos, S)
print(resultado)
print(resultado)
Explicação do código:
- A função
reproduce exatamente a ideia dos passos anteriores: começa com e , itera pelas movimentações atualizando e . - O programa principal lê
e , depois lê linhas com as movimentações e as armazena no vetor movimentos. Em seguida chama a função e imprime o resultado.
Passo 6
Aplicando ao exemplo fornecido (mostrando passo a passo dos saldos).
- Interpretação da entrada de exemplo (peguei esses números do enunciado de exemplo):
- Primeira linha:
e . - Movimentações (próximas
linhas): , , .
- Primeira linha:
- Vamos calcular
e acompanhar o mínimo : - Inicialmente:
. Então . - Dia 1:
. Atualiza . - Dia 2:
. Atualiza . - Dia 3:
. Atualiza .
- Inicialmente:
- Resultado final: menor saldo
.
Passo 7
Dicas rápidas para a prova (como garantir que não dá zebra)
- Sempre inicialize o menor saldo
com o saldo inicial , não com zero. - Se a entrada puder ter
e em linhas separadas, trate ambos os casos (uma linha com dois inteiros ou duas linhas). - Teste mentalmente com
e com movimentos todos positivos / todos negativos. - Evite arredondamentos: estamos trabalhando com inteiros.
Resposta
300