SlideShare uma empresa Scribd logo
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 1
Estiagem
Gilberto Gampert1
Resumo: Este artigo descreve a solução para o problema denominado Estiagem apresentado na
XIII Maratona de Programação IME-USP de 2009. O contexto do problema é calcular o consumo
médio de determinadas regiões para avaliar o comportamento da população em época de
racionamento. Serão informados dados de consumo de algumas cidades (por amostragem) e o
algoritmo deverá apresentar o consumo por pessoa e o consumo médio 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. Otimização 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.
1 O problema da estiagem
O presente artigo, para a disciplina de Algoritmos e Estruturas de dados, visa apresentar a solução para o
problema da Estiagem, que foi apresentado na XIII Maratona de Programação IME-USP de 2009, que foi obtido
no site URI Online Judge.
Segundo o autor do problema [1], o governo federal criou um órgão para avaliação do consumo em
regiões onde ocorre estiagem. O objetivo é avaliar o comportamento da população em época de racionamento.
Este órgão vai avaliar algumas cidades (por amostragem) e calcular o consumo por pessoa e o consumo médio
da cidade habitante.
1.1 Entrada
Serão fornecidos diversos casos de teste. Para cada caso deve-se informar um número inteiro N (1 ≤ N ≤
1*106
) que indica a quantidade de imóveis. Para cada imóvel 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 imóvel. Nenhum imóvel consome mais do que 200 m3
por mês. Deve-se indicar o final da
entrada de dados informando o número 0 (zero) na quantidade de imóveis.
1.2 Saída
Para cada conjunto de informações, deve-se exibir a mensagem “Cidade# n:”, sendo n o número da
cidade. A seguir deve-se listar, em ordem crescente de consumo, a quantidade de pessoas, um hífen e o consumo
destas pessoas (arredondado para baixo). Na próxima linha, deve-se exibir o consumo médio por pessoa da
cidade, com 2 casas decimais e sem arredondamento. Imprimir uma linha em branco entre dois casos de testes.
1
Programa de Pós-Graduação em Computação Aplicada. Instituto de Ciências Exatas e Geociências, UPF, Campus 1 - BR
285 - Passo Fundo (RS) - Brasil
{gampert@upf.br}
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 2
No final da saída não deve haver uma linha em branco. A Tab. 1 exemplifica um conjunto de entrada e as saídas
esperadas.
Tabela 1: Exemplo de entradas e saídas
Entradas Saídas
3
3 22
2 11
3 39
5
1 25
2 20
3 31
2 40
6 70
0
Cidade# 1:
2-5 3-7 3-13
Consumo medio: 9.00 m3.
Cidade# 2:
5-10 6-11 2-20 1-25
Consumo medio: 13.28 m3.
2 Solução
Após o estudo do problema, identificou-se que existem 2 desafios principais na resolução 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 solução que proposta neste trabalho, testou-se a possibilidade de trabalhar com
alocação dinâmica para o vetor e a utilização de um método de ordenação. Descreve-se a seguir as duas técnicas
utilizadas e a conclusão de qual foi mais eficiente.
2.1 Alocação dinâmica e ordenação
Na primeira alternativa de solução, após ler os dados de uma cidade, calculou-se o consumo por pessoa
para cada imóvel e verificou-se se o consumo já estava presente no vetor. Em caso positivo, somou-se o número
de pessoas naquela posição do vetor. Caso contrário, uma nova posição foi alocada dinamicamente e inicializada
com o número de pessoas. Após ler e processar todos os valores da cidade, procedeu-se com a ordenação do
vetor, utilizando o algoritmo quicksort [2]. O pseudocódigo abaixo demonstra o núcleo da ideia:
1. ler num;
2. para i de 0 até num {
3. ler pessoas, consumo;
4. cons_med = arred_abaixo((inteiro) consumo / pessoas);
5. se cons_acum[cons_med]
6. cons_acum[cons_med] += pessoas;
7. senão {
8. aloca(cons_acum[cons_med]);
9. cons_acum[cons_med] = pessoas;
10. }
11. }
12. ordenar(cons_acum);
Ao término da execução do algoritmo desta técnica, utilizando como entrada o primeiro caso do exemplo
da Tab. 1, o vetor apresentou-se como mostrado na Figura 1. Esta técnica falha em atender aos requisitos do
problema, pois a mesma estourou o tempo limite de 2 segundos.
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 3
Figura 1: Vetor após a execução da primeira técnica
2.2 Acumular ordenado
Na segunda alternativa, utilizou-se um vetor com alocação prévia de 200 posições, pois o problema deixa
claro que o consumo não poderá ser maior do que este valor, estabele-se assim um limitador. Então, utilizamos a
fórmula descrita em (1) para determinar o índice do vetor. O valor obtido, é um dos possíveis consumos, no
intervalo fechado de 1 até 200.
indice = arred_abaixo((inteiro) consumo / pessoas); (1)
Basta acumular o número de pessoas que apresentam este consumo no índice do vetor obtido no cálculo e
o vetor estará organizado automaticamente. O pseudocódigo a seguir ilustra a técnica:
1. declara e inicializa cons_acum[200];
2. ler num;
3. para i de 0 até num {
4. ler pessoas, consumo;
5. indice = arred_abaixo((inteiro) consumo / pessoas);
6. cons_acum[indice] += pessoas;
7. }
Ao término da execução do algoritmo desta técnica, utilizando como entrada o primeiro caso do exemplo
da Tab. 1, o vetor apresentou-se como mostrado na Figura 2.
Figura 2: Vetor após a execução da segunda técnica
Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 4
Esta nova abordagem tem a vantagem de acumular a quantidade de pessoas na posição que o índice do
vetor que corresponde ao consumo aponta e desta forma, automaticamente, ordena em ordem crescente de
consumo. Como não há necessidade de alocar dinamicamente cada posição do vetor e nem ordenar para exibir
em ordem crescente, o tempo limite de 2 segundos foi respeitado.
3 Considerações finais
Observou-se que a primeira técnica foi mais eficiente na utilização da memória. Ela somente aloca uma
nova posição no vetor quando detecta uma nova média de consumo. Porém, apesar de mais econômica, a técnica
estourou o tempo limite pelo problema, sendo assim descartada.
A segunda técnica não apresentou tanta eficiência na utilização de memória, pois iniciava o algoritmo
com o vetor de 200 posições pré-alocado. Mas, foi muito mais eficiente na execução para o pior caso, 1*106
casos, sendo que apresentou tempo inferior ao limite proposto pelo problema.
Referências
[1] TONIN, Neilor. Estiagem. Uri Online Judge (Online), 2009. Disponível em:
http://www.urionlinejudge.com.br/judge/pt/problems/view/1023. 1023. Acesso em: 25 mai. 2014.
[2] FARIAS, Fábio Henrique de; SILVA, Fabiano Barbosa Mendes da. Quicksort e Quicksort Aleatorizado: Um
estudo comparativo. Congresso de Matemática Aplicada e Computacional CMAC Nordeste. Anual, 2012.

Mais conteúdo relacionado

Mais procurados

Filosofia das religiões aulas 1 e 2
Filosofia das religiões aulas 1 e 2Filosofia das religiões aulas 1 e 2
Filosofia das religiões aulas 1 e 2
Keiler Vasconcelos
 
Industrialização
IndustrializaçãoIndustrialização
Industrialização
Suely Takahashi
 
Fenomenologia e existencialimo
Fenomenologia e existencialimoFenomenologia e existencialimo
Fenomenologia e existencialimo
Silvia Cintra
 
Aula 08 - Filosofia Contemporânea
Aula 08 - Filosofia ContemporâneaAula 08 - Filosofia Contemporânea
Aula 08 - Filosofia Contemporânea
Anderson Favaro
 
O expressionismo alemão no cinema
O expressionismo alemão no cinemaO expressionismo alemão no cinema
O expressionismo alemão no cinema
José Costa
 
Construtivismo russo
Construtivismo russoConstrutivismo russo
Construtivismo russo
Viviane Marques
 
Estética e Arte Contemporânea - Aulas 1 e 2
Estética e Arte Contemporânea - Aulas 1 e 2Estética e Arte Contemporânea - Aulas 1 e 2
Estética e Arte Contemporânea - Aulas 1 e 2
Fernando Alves
 
Princípios da ciência geográfica
Princípios da ciência geográficaPrincípios da ciência geográfica
Princípios da ciência geográfica
Carminha
 
Corrêa, roberto lobato regi o e organizaç-o espacial
Corrêa, roberto lobato   regi o e organizaç-o espacialCorrêa, roberto lobato   regi o e organizaç-o espacial
Corrêa, roberto lobato regi o e organizaç-o espacial
pedro vergasta
 
Arte afro brasileira
Arte afro brasileiraArte afro brasileira
Arte afro brasileira
Tauana Parreiras
 
Renascimento
RenascimentoRenascimento
Renascimento
catlencunha
 
Aula de filosofia antiga parmênides de eléia
Aula de filosofia antiga parmênides de eléiaAula de filosofia antiga parmênides de eléia
Aula de filosofia antiga parmênides de eléia
Leandro Nazareth Souto
 
Nietzsche filosofia final
Nietzsche filosofia  finalNietzsche filosofia  final
Nietzsche filosofia final
Hugo Lima
 
Rede urbana
Rede urbanaRede urbana
Rede urbana
Elô Steffens
 
História do Planejamento Regional
História do Planejamento RegionalHistória do Planejamento Regional
História do Planejamento Regional
Taina Silva
 
Estética em Schiller
Estética em SchillerEstética em Schiller
Estética em Schiller
Marcos Ramon
 
Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...
Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...
Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...
UNICAMP/SP
 
CUBISMO
CUBISMOCUBISMO
CUBISMO
AndrLeite52
 
Arte minimalista
Arte minimalistaArte minimalista
Arte minimalista
samuel ananias
 
Geografia urbanizacao
Geografia urbanizacaoGeografia urbanizacao
Geografia urbanizacao
Alessandro Ribeiro
 

Mais procurados (20)

Filosofia das religiões aulas 1 e 2
Filosofia das religiões aulas 1 e 2Filosofia das religiões aulas 1 e 2
Filosofia das religiões aulas 1 e 2
 
Industrialização
IndustrializaçãoIndustrialização
Industrialização
 
Fenomenologia e existencialimo
Fenomenologia e existencialimoFenomenologia e existencialimo
Fenomenologia e existencialimo
 
Aula 08 - Filosofia Contemporânea
Aula 08 - Filosofia ContemporâneaAula 08 - Filosofia Contemporânea
Aula 08 - Filosofia Contemporânea
 
O expressionismo alemão no cinema
O expressionismo alemão no cinemaO expressionismo alemão no cinema
O expressionismo alemão no cinema
 
Construtivismo russo
Construtivismo russoConstrutivismo russo
Construtivismo russo
 
Estética e Arte Contemporânea - Aulas 1 e 2
Estética e Arte Contemporânea - Aulas 1 e 2Estética e Arte Contemporânea - Aulas 1 e 2
Estética e Arte Contemporânea - Aulas 1 e 2
 
Princípios da ciência geográfica
Princípios da ciência geográficaPrincípios da ciência geográfica
Princípios da ciência geográfica
 
Corrêa, roberto lobato regi o e organizaç-o espacial
Corrêa, roberto lobato   regi o e organizaç-o espacialCorrêa, roberto lobato   regi o e organizaç-o espacial
Corrêa, roberto lobato regi o e organizaç-o espacial
 
Arte afro brasileira
Arte afro brasileiraArte afro brasileira
Arte afro brasileira
 
Renascimento
RenascimentoRenascimento
Renascimento
 
Aula de filosofia antiga parmênides de eléia
Aula de filosofia antiga parmênides de eléiaAula de filosofia antiga parmênides de eléia
Aula de filosofia antiga parmênides de eléia
 
Nietzsche filosofia final
Nietzsche filosofia  finalNietzsche filosofia  final
Nietzsche filosofia final
 
Rede urbana
Rede urbanaRede urbana
Rede urbana
 
História do Planejamento Regional
História do Planejamento RegionalHistória do Planejamento Regional
História do Planejamento Regional
 
Estética em Schiller
Estética em SchillerEstética em Schiller
Estética em Schiller
 
Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...
Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...
Parte I do livro MUDAR A CIDADE - Marcelo Lopes de Souza (Planejamento Urbano...
 
CUBISMO
CUBISMOCUBISMO
CUBISMO
 
Arte minimalista
Arte minimalistaArte minimalista
Arte minimalista
 
Geografia urbanizacao
Geografia urbanizacaoGeografia urbanizacao
Geografia urbanizacao
 

Destaque

Gameficação para negócios
Gameficação para negóciosGameficação para negócios
Gameficação para negócios
Marcel Cohn
 
Internet das Coisas
Internet das CoisasInternet das Coisas
Crowdsourcing
CrowdsourcingCrowdsourcing
Crowdsourcing
Gil Giardelli
 
Verificação, validação e teste de software ágil
Verificação, validação e teste de software ágilVerificação, validação e teste de software ágil
Verificação, validação e teste de software ágil
Gilberto Gampert
 
Problema de corte bidimensional
Problema de corte bidimensionalProblema de corte bidimensional
Problema de corte bidimensional
Gilberto Gampert
 
CIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕES
CIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕESCIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕES
CIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕES
Gilberto Gampert
 
A hora de jogo diagnóstica
A hora de jogo diagnósticaA hora de jogo diagnóstica
A hora de jogo diagnóstica
Ludmila Moura
 
Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...
Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...
Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...
Heitor Albernaz
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
Drift
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
Leslie Samuel
 

Destaque (10)

Gameficação para negócios
Gameficação para negóciosGameficação para negócios
Gameficação para negócios
 
Internet das Coisas
Internet das CoisasInternet das Coisas
Internet das Coisas
 
Crowdsourcing
CrowdsourcingCrowdsourcing
Crowdsourcing
 
Verificação, validação e teste de software ágil
Verificação, validação e teste de software ágilVerificação, validação e teste de software ágil
Verificação, validação e teste de software ágil
 
Problema de corte bidimensional
Problema de corte bidimensionalProblema de corte bidimensional
Problema de corte bidimensional
 
CIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕES
CIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕESCIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕES
CIDADES INTELIGENTES – PRINCÍPIOS, TECNOLOGIAS E APLICAÇÕES
 
A hora de jogo diagnóstica
A hora de jogo diagnósticaA hora de jogo diagnóstica
A hora de jogo diagnóstica
 
Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...
Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...
Por onde vamos? O engajamento, a colaboração e o crowdsourcing no aplicativo ...
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

Semelhante a Estiagem

Diogo t.robaina edp
Diogo t.robaina edpDiogo t.robaina edp
Diogo t.robaina edp
Adriano Alves
 
Algoritmo maxmin
Algoritmo maxminAlgoritmo maxmin
Algoritmo maxmin
Daniel Soares
 
382 po apostila_completa_mais_livro
382 po apostila_completa_mais_livro382 po apostila_completa_mais_livro
382 po apostila_completa_mais_livro
Hedileno Monteiro
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
ssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
ssuserd654cb1
 
O problema do transporte aplicado à grafos
O problema do transporte aplicado à grafosO problema do transporte aplicado à grafos
O problema do transporte aplicado à grafos
Eduardo Souza
 
Dimensionamento de sistemas de gas
Dimensionamento de sistemas de gasDimensionamento de sistemas de gas
Dimensionamento de sistemas de gas
carlos
 
As funcionalidades do winplot no ensino de funções
As funcionalidades do winplot no ensino de funçõesAs funcionalidades do winplot no ensino de funções
As funcionalidades do winplot no ensino de funções
01698928
 
Taco dimensionamento de-elementos_de_madeira
Taco dimensionamento de-elementos_de_madeiraTaco dimensionamento de-elementos_de_madeira
Taco dimensionamento de-elementos_de_madeira
Ludmilla Barbosa
 
Funções
FunçõesFunções
Funções
Cleber Ribeiro
 
IMRT, sua Implementação no CAT3D
IMRT,  sua Implementação no CAT3DIMRT,  sua Implementação no CAT3D
IMRT, sua Implementação no CAT3D
Armando Alaminos Bouza
 
Mat exercicios resolvidos e comentados 014
Mat exercicios resolvidos e comentados  014Mat exercicios resolvidos e comentados  014
Mat exercicios resolvidos e comentados 014
trigono_metrico
 
Pesquisa Operacional
Pesquisa OperacionalPesquisa Operacional
Pesquisa Operacional
André Gustavo Santos
 
A gnuplot tutorial
A gnuplot tutorialA gnuplot tutorial
A gnuplot tutorial
Lagal Tchixa
 
Cálculo Numérico: Integração Numérica com Bubble Sort
Cálculo Numérico: Integração Numérica com Bubble SortCálculo Numérico: Integração Numérica com Bubble Sort
Cálculo Numérico: Integração Numérica com Bubble Sort
Johnnatan Messias
 
Programação Dinâmica
Programação DinâmicaProgramação Dinâmica
Programação Dinâmica
Orlando Junior
 
Aula10 problema-transporte
Aula10 problema-transporteAula10 problema-transporte
Aula10 problema-transporte
Lorran Mol
 
Análise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenaçãoAnálise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenação
Orlando Junior
 
Tutorial QGIS sobre Análise Fisiográfica
Tutorial QGIS sobre Análise FisiográficaTutorial QGIS sobre Análise Fisiográfica
Tutorial QGIS sobre Análise Fisiográfica
nlourei
 
Exercicios c
Exercicios cExercicios c
Exercicios c
Jaime Martins
 

Semelhante a Estiagem (20)

Diogo t.robaina edp
Diogo t.robaina edpDiogo t.robaina edp
Diogo t.robaina edp
 
Algoritmo maxmin
Algoritmo maxminAlgoritmo maxmin
Algoritmo maxmin
 
382 po apostila_completa_mais_livro
382 po apostila_completa_mais_livro382 po apostila_completa_mais_livro
382 po apostila_completa_mais_livro
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
O problema do transporte aplicado à grafos
O problema do transporte aplicado à grafosO problema do transporte aplicado à grafos
O problema do transporte aplicado à grafos
 
Dimensionamento de sistemas de gas
Dimensionamento de sistemas de gasDimensionamento de sistemas de gas
Dimensionamento de sistemas de gas
 
As funcionalidades do winplot no ensino de funções
As funcionalidades do winplot no ensino de funçõesAs funcionalidades do winplot no ensino de funções
As funcionalidades do winplot no ensino de funções
 
Taco dimensionamento de-elementos_de_madeira
Taco dimensionamento de-elementos_de_madeiraTaco dimensionamento de-elementos_de_madeira
Taco dimensionamento de-elementos_de_madeira
 
Funções
FunçõesFunções
Funções
 
IMRT, sua Implementação no CAT3D
IMRT,  sua Implementação no CAT3DIMRT,  sua Implementação no CAT3D
IMRT, sua Implementação no CAT3D
 
Mat exercicios resolvidos e comentados 014
Mat exercicios resolvidos e comentados  014Mat exercicios resolvidos e comentados  014
Mat exercicios resolvidos e comentados 014
 
Pesquisa Operacional
Pesquisa OperacionalPesquisa Operacional
Pesquisa Operacional
 
A gnuplot tutorial
A gnuplot tutorialA gnuplot tutorial
A gnuplot tutorial
 
Cálculo Numérico: Integração Numérica com Bubble Sort
Cálculo Numérico: Integração Numérica com Bubble SortCálculo Numérico: Integração Numérica com Bubble Sort
Cálculo Numérico: Integração Numérica com Bubble Sort
 
Programação Dinâmica
Programação DinâmicaProgramação Dinâmica
Programação Dinâmica
 
Aula10 problema-transporte
Aula10 problema-transporteAula10 problema-transporte
Aula10 problema-transporte
 
Análise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenaçãoAnálise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenação
 
Tutorial QGIS sobre Análise Fisiográfica
Tutorial QGIS sobre Análise FisiográficaTutorial QGIS sobre Análise Fisiográfica
Tutorial QGIS sobre Análise Fisiográfica
 
Exercicios c
Exercicios cExercicios c
Exercicios c
 

Estiagem

  • 1. Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 1 Estiagem Gilberto Gampert1 Resumo: Este artigo descreve a solução para o problema denominado Estiagem apresentado na XIII Maratona de Programação IME-USP de 2009. O contexto do problema é calcular o consumo médio de determinadas regiões para avaliar o comportamento da população em época de racionamento. Serão informados dados de consumo de algumas cidades (por amostragem) e o algoritmo deverá apresentar o consumo por pessoa e o consumo médio 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. Otimização 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. 1 O problema da estiagem O presente artigo, para a disciplina de Algoritmos e Estruturas de dados, visa apresentar a solução para o problema da Estiagem, que foi apresentado na XIII Maratona de Programação IME-USP de 2009, que foi obtido no site URI Online Judge. Segundo o autor do problema [1], o governo federal criou um órgão para avaliação do consumo em regiões onde ocorre estiagem. O objetivo é avaliar o comportamento da população em época de racionamento. Este órgão vai avaliar algumas cidades (por amostragem) e calcular o consumo por pessoa e o consumo médio da cidade habitante. 1.1 Entrada Serão fornecidos diversos casos de teste. Para cada caso deve-se informar um número inteiro N (1 ≤ N ≤ 1*106 ) que indica a quantidade de imóveis. Para cada imóvel 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 imóvel. Nenhum imóvel consome mais do que 200 m3 por mês. Deve-se indicar o final da entrada de dados informando o número 0 (zero) na quantidade de imóveis. 1.2 Saída Para cada conjunto de informações, deve-se exibir a mensagem “Cidade# n:”, sendo n o número da cidade. A seguir deve-se listar, em ordem crescente de consumo, a quantidade de pessoas, um hífen e o consumo destas pessoas (arredondado para baixo). Na próxima linha, deve-se exibir o consumo médio por pessoa da cidade, com 2 casas decimais e sem arredondamento. Imprimir uma linha em branco entre dois casos de testes. 1 Programa de Pós-Graduação em Computação Aplicada. Instituto de Ciências Exatas e Geociências, UPF, Campus 1 - BR 285 - Passo Fundo (RS) - Brasil {gampert@upf.br}
  • 2. Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 2 No final da saída não deve haver uma linha em branco. A Tab. 1 exemplifica um conjunto de entrada e as saídas esperadas. Tabela 1: Exemplo de entradas e saídas Entradas Saídas 3 3 22 2 11 3 39 5 1 25 2 20 3 31 2 40 6 70 0 Cidade# 1: 2-5 3-7 3-13 Consumo medio: 9.00 m3. Cidade# 2: 5-10 6-11 2-20 1-25 Consumo medio: 13.28 m3. 2 Solução Após o estudo do problema, identificou-se que existem 2 desafios principais na resolução 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 solução que proposta neste trabalho, testou-se a possibilidade de trabalhar com alocação dinâmica para o vetor e a utilização de um método de ordenação. Descreve-se a seguir as duas técnicas utilizadas e a conclusão de qual foi mais eficiente. 2.1 Alocação dinâmica e ordenação Na primeira alternativa de solução, após ler os dados de uma cidade, calculou-se o consumo por pessoa para cada imóvel e verificou-se se o consumo já estava presente no vetor. Em caso positivo, somou-se o número de pessoas naquela posição do vetor. Caso contrário, uma nova posição foi alocada dinamicamente e inicializada com o número de pessoas. Após ler e processar todos os valores da cidade, procedeu-se com a ordenação do vetor, utilizando o algoritmo quicksort [2]. O pseudocódigo abaixo demonstra o núcleo da ideia: 1. ler num; 2. para i de 0 até num { 3. ler pessoas, consumo; 4. cons_med = arred_abaixo((inteiro) consumo / pessoas); 5. se cons_acum[cons_med] 6. cons_acum[cons_med] += pessoas; 7. senão { 8. aloca(cons_acum[cons_med]); 9. cons_acum[cons_med] = pessoas; 10. } 11. } 12. ordenar(cons_acum); Ao término da execução do algoritmo desta técnica, utilizando como entrada o primeiro caso do exemplo da Tab. 1, o vetor apresentou-se como mostrado na Figura 1. Esta técnica falha em atender aos requisitos do problema, pois a mesma estourou o tempo limite de 2 segundos.
  • 3. Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 3 Figura 1: Vetor após a execução da primeira técnica 2.2 Acumular ordenado Na segunda alternativa, utilizou-se um vetor com alocação prévia de 200 posições, pois o problema deixa claro que o consumo não poderá ser maior do que este valor, estabele-se assim um limitador. Então, utilizamos a fórmula descrita em (1) para determinar o índice do vetor. O valor obtido, é um dos possíveis consumos, no intervalo fechado de 1 até 200. indice = arred_abaixo((inteiro) consumo / pessoas); (1) Basta acumular o número de pessoas que apresentam este consumo no índice do vetor obtido no cálculo e o vetor estará organizado automaticamente. O pseudocódigo a seguir ilustra a técnica: 1. declara e inicializa cons_acum[200]; 2. ler num; 3. para i de 0 até num { 4. ler pessoas, consumo; 5. indice = arred_abaixo((inteiro) consumo / pessoas); 6. cons_acum[indice] += pessoas; 7. } Ao término da execução do algoritmo desta técnica, utilizando como entrada o primeiro caso do exemplo da Tab. 1, o vetor apresentou-se como mostrado na Figura 2. Figura 2: Vetor após a execução da segunda técnica
  • 4. Revista Brasileira de Computação Aplicada (ISSN 2176-6649), Passo Fundo, v. 5, n. 2, p. xx-xx, out. 2013 4 Esta nova abordagem tem a vantagem de acumular a quantidade de pessoas na posição que o índice do vetor que corresponde ao consumo aponta e desta forma, automaticamente, ordena em ordem crescente de consumo. Como não há necessidade de alocar dinamicamente cada posição do vetor e nem ordenar para exibir em ordem crescente, o tempo limite de 2 segundos foi respeitado. 3 Considerações finais Observou-se que a primeira técnica foi mais eficiente na utilização da memória. Ela somente aloca uma nova posição no vetor quando detecta uma nova média de consumo. Porém, apesar de mais econômica, a técnica estourou o tempo limite pelo problema, sendo assim descartada. A segunda técnica não apresentou tanta eficiência na utilização de memória, pois iniciava o algoritmo com o vetor de 200 posições pré-alocado. Mas, foi muito mais eficiente na execução para o pior caso, 1*106 casos, sendo que apresentou tempo inferior ao limite proposto pelo problema. Referências [1] TONIN, Neilor. Estiagem. Uri Online Judge (Online), 2009. Disponível em: http://www.urionlinejudge.com.br/judge/pt/problems/view/1023. 1023. Acesso em: 25 mai. 2014. [2] FARIAS, Fábio Henrique de; SILVA, Fabiano Barbosa Mendes da. Quicksort e Quicksort Aleatorizado: Um estudo comparativo. Congresso de Matemática Aplicada e Computacional CMAC Nordeste. Anual, 2012.