You are on page 1of 4

Estiagem

Gilberto Gampert1
Resumo: Este artigo descreve a soluo para o problema denominado Estiagem apresentado na
XIII Maratona de Programao IME-USP de 2009. O contexto do problema calcular o consumo
mdio de determinadas regies para avaliar o comportamento da populao em poca de
racionamento. Sero informados dados de consumo de algumas cidades (por amostragem) e o
algoritmo dever apresentar o consumo por pessoa e o consumo mdio da cidade por habitante.
Como h um limitador de tempo, o resultado dever ser apresentado em menos de 2 segundos.
Palavras-chave: URI Online Judge. Otimizao de algoritmo. Problema da estiagem.

Abstract: This article describes the solution to the problem named Drought presented in the XIII
Programming Marathon IME-USP, 2009. The context of the problem is calculate the average
consumption of certain regions to assess the behavior of the population in times of rationing.
Consumption data from some cities will be informed (by sampling) and the algorithm should
present per capita consumption and the average consumption of the city. As there is a limit of
time, the result should be displayed in less than 2 seconds.
Keywords: URI Online Judge. Algorithm optimization. Problem of drought.

O problema da estiagem

O presente artigo, para a disciplina de Algoritmos e Estruturas de dados, visa apresentar a soluo para o
problema da Estiagem, que foi apresentado na XIII Maratona de Programao IME-USP de 2009, que foi obtido
no site URI Online Judge.
Segundo o autor do problema [1], o governo federal criou um rgo para avaliao do consumo em
regies onde ocorre estiagem. O objetivo avaliar o comportamento da populao em poca de racionamento.
Este rgo vai avaliar algumas cidades (por amostragem) e calcular o consumo por pessoa e o consumo mdio
da cidade habitante.
1.1 Entrada
Sero fornecidos diversos casos de teste. Para cada caso deve-se informar um nmero inteiro N (1 N
1*106) que indica a quantidade de imveis. Para cada imvel deve-se ler um par de valores inteiros, sendo o
primeiro X (1 X 10) indicando a quantidade de moradores e o segundo Y (1 Y 200) indicando o
consumo total do imvel. Nenhum imvel consome mais do que 200 m3 por ms. Deve-se indicar o final da
entrada de dados informando o nmero 0 (zero) na quantidade de imveis.
1.2 Sada
Para cada conjunto de informaes, deve-se exibir a mensagem Cidade# n:, sendo n o nmero da
cidade. A seguir deve-se listar, em ordem crescente de consumo, a quantidade de pessoas, um hfen e o consumo
destas pessoas (arredondado para baixo). Na prxima linha, deve-se exibir o consumo mdio por pessoa da
cidade, com 2 casas decimais e sem arredondamento. Imprimir uma linha em branco entre dois casos de testes.
1

Programa de Ps-Graduao em Computao Aplicada. Instituto de Cincias Exatas e Geocincias, UPF, Campus 1 - BR
285 - Passo Fundo (RS) - Brasil
{gampert@upf.br}

Revista Brasileira de Computao Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013

No final da sada no deve haver uma linha em branco. A Tab. 1 exemplifica um conjunto de entrada e as sadas
esperadas.
Tabela 1: Exemplo de entradas e sadas
Entradas
Sadas
3
Cidade# 1:
3 22
2-5 3-7 3-13
2 11
Consumo medio: 9.00 m3.
3 39
5
Cidade# 2:
1 25
5-10 6-11 2-20 1-25
2 20
Consumo medio: 13.28 m3.
3 31
2 40
6 70
0

Soluo
Aps o estudo do problema, identificou-se que existem 2 desafios principais na resoluo do problema:
Primeiro: acumular e exibir em ordem crescente de consumo;
Segundo: o limite de tempo de 2 segundos.
Percebeu-se que a melhor forma de acumular o consumo utilizar um vetor.

Antes de chegar na soluo que proposta neste trabalho, testou-se a possibilidade de trabalhar com
alocao dinmica para o vetor e a utilizao de um mtodo de ordenao. Descreve-se a seguir as duas tcnicas
utilizadas e a concluso de qual foi mais eficiente.
2.1 Alocao dinmica e ordenao
Na primeira alternativa de soluo, aps ler os dados de uma cidade, calculou-se o consumo por pessoa
para cada imvel e verificou-se se o consumo j estava presente no vetor. Em caso positivo, somou-se o nmero
de pessoas naquela posio do vetor. Caso contrrio, uma nova posio foi alocada dinamicamente e inicializada
com o nmero de pessoas. Aps ler e processar todos os valores da cidade, procedeu-se com a ordenao do
vetor, utilizando o algoritmo quicksort [2]. O pseudocdigo abaixo demonstra o ncleo da ideia:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

ler num;
para i de 0 at num {
ler pessoas, consumo;
cons_med = arred_abaixo((inteiro) consumo / pessoas);
se cons_acum[cons_med]
cons_acum[cons_med] += pessoas;
seno {
aloca(cons_acum[cons_med]);
cons_acum[cons_med] = pessoas;
}
}
ordenar(cons_acum);

Ao trmino da execuo do algoritmo desta tcnica, utilizando como entrada o primeiro caso do exemplo
da Tab. 1, o vetor apresentou-se como mostrado na Figura 1. Esta tcnica falha em atender aos requisitos do
problema, pois a mesma estourou o tempo limite de 2 segundos.

Revista Brasileira de Computao Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013

Figura 1: Vetor aps a execuo da primeira tcnica


2.2 Acumular ordenado
Na segunda alternativa, utilizou-se um vetor com alocao prvia de 200 posies, pois o problema deixa
claro que o consumo no poder ser maior do que este valor, estabele-se assim um limitador. Ento, utilizamos a
frmula descrita em (1) para determinar o ndice do vetor. O valor obtido, um dos possveis consumos, no
intervalo fechado de 1 at 200.
indice = arred_abaixo((inteiro) consumo / pessoas);

(1)

Basta acumular o nmero de pessoas que apresentam este consumo no ndice do vetor obtido no clculo e
o vetor estar organizado automaticamente. O pseudocdigo a seguir ilustra a tcnica:
1.
2.
3.
4.
5.
6.
7.

declara e inicializa cons_acum[200];


ler num;
para i de 0 at num {
ler pessoas, consumo;
indice = arred_abaixo((inteiro) consumo / pessoas);
cons_acum[indice] += pessoas;
}

Ao trmino da execuo do algoritmo desta tcnica, utilizando como entrada o primeiro caso do exemplo
da Tab. 1, o vetor apresentou-se como mostrado na Figura 2.

Figura 2: Vetor aps a execuo da segunda tcnica

Revista Brasileira de Computao Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013

Esta nova abordagem tem a vantagem de acumular a quantidade de pessoas na posio que o ndice do
vetor que corresponde ao consumo aponta e desta forma, automaticamente, ordena em ordem crescente de
consumo. Como no h necessidade de alocar dinamicamente cada posio do vetor e nem ordenar para exibir
em ordem crescente, o tempo limite de 2 segundos foi respeitado.

Consideraes finais

Observou-se que a primeira tcnica foi mais eficiente na utilizao da memria. Ela somente aloca uma
nova posio no vetor quando detecta uma nova mdia de consumo. Porm, apesar de mais econmica, a tcnica
estourou o tempo limite pelo problema, sendo assim descartada.
A segunda tcnica no apresentou tanta eficincia na utilizao de memria, pois iniciava o algoritmo
com o vetor de 200 posies pr-alocado. Mas, foi muito mais eficiente na execuo para o pior caso, 1*106
casos, sendo que apresentou tempo inferior ao limite proposto pelo problema.

Referncias
[1]
TONIN,
Neilor.
Estiagem.
Uri
Online
Judge
(Online),
2009.
Disponvel
em:
http://www.urionlinejudge.com.br/judge/pt/problems/view/1023. 1023. Acesso em: 25 mai. 2014.
[2] FARIAS, Fbio Henrique de; SILVA, Fabiano Barbosa Mendes da. Quicksort e Quicksort Aleatorizado: Um
estudo comparativo. Congresso de Matemtica Aplicada e Computacional CMAC Nordeste. Anual, 2012.

Revista Brasileira de Computao Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013