Anda di halaman 1dari 6

Movimentaes Econmicas

Paulo Ricardo Silveira Jnior*

Faculdade de Informtica PUCRS 22 de junho de 2011 Resumo Esse artigo tem por finalidade descrever a possvel soluo para o problema proposto pelo segundo trabalho da disciplina Algoritmos e Programao III do primeiro semestre de 2011, que consiste em reduzir movimentaes bancrias e por consequncia os impostos pagos pelas movimentaes. Introduo O segundo trabalho da disciplina de Algoritmos e Programao III tem por objetivo criar um algoritmo que consiga resolver o seguinte problema: Dado um nmero k de correntistas e um nmero m de movimentos, a cada movimentao realizada entre os correntistas cobrada uma taxa de 1% do valor movimentado. O desafio proposto tem como objetivo simplificar essas movimentaes, por exemplo: se um correntista A, deseja depositar cinqenta reais na conta de B, sendo que esse precisa transferir quarenta reais para conta de C, nessa situao o algoritmo deve ser capaz de fazer com que o correntista A transfira quarenta reais para C e dez reais para B e assim reduzir as taxas das transferncias realizadas. Abaixo uma ilustrao da situao usada como exemplo: 1- Movimentaes originais:

50

40

silveira.paulor@gmail.com

2- Movimentaes simplificadas: 10

B C

A
40

Cada vez que o algoritmo encontrar uma movimentao ele deve verificar a possibilidade de simplific-la para que ao final do seu processamento ele tenha feito todas as simplificaes possveis e assim reduzir a taxa cobrada por cada transferncia. Como proposta de uma possvel soluo do problema, foi desenvolvido o algoritmo que ser descrito com maiores detalhes abaixo e tambm possveis casos de movimentaes, alm do citado acima. Possvel Soluo O algoritmo que se prope solucionar o desafio proposto pela disciplina utiliza como estrutura de dados uma matriz de adjacncias, j que a entrada do problema representada da seguinte forma: [A, B, 50], ou seja, nessa situao estamos representando uma nica movimentao, onde A (origem) transfere cinqenta reais para B(destino). Como entrada do algoritmo ter uma lista de correntistas e uma lista de movimentaes, limitando-se a no mximo quinhentas movimentaes. Sendo assim, dada uma matriz de adjacncias m, o algoritmo executa seu processamento da seguinte maneira:
1-

Comea a percorrer por todas as colunas j de uma linha i, onde i indica posio atual da linha na matriz e j a posio da coluna atual da matriz, at encontrar um valor no par m[i, j] que seja diferente de zero. O processo executado para todas as linhas e colunas da matriz. Quando o algoritmo encontra um valor diferente de zero no par m[i, j], o algoritmo guarda o valor encontrado em uma varivel que chamaremos de valorUm e vai at a linha da matriz que tenha valor igual ao j, para ver se nessa linha feita a transferncia para outra conta. Nesse passo o algoritmo novamente caminha por todas as colunas c relacionas a linha em questo, at localizar um valor diferente de zero e quando localiza o valor armazenado em uma varivel que aqui chamaremos de valorDois.

2-

silveira.paulor@gmail.com

3-

Nesse momento o algoritmo j fez o elo m[i, j] e m[j, c], ou seja, ele guardou o valor que A(i) transfere para B(j) em valorUm e o valor que B(j) transfere para C(c) em valorDois. Agora que o algoritmo sabe qual conta transfere qual valor, ele verifica trs condies que definem de que forma ser realizada a simplificao da movimentao em jogo. As condies so e os respectivos processamentos so os seguintes: 4.1- Se valorUm for IGUAL a valorDois a simplificao realizada da seguinte maneira: - m[i, j] que guardava o valor transferido de A para B, guardar zero; - m[j, c] que guardava o valor transferido de B para C, tambm guardar zero; - m[i, c] representar uma nova transferncia de realizada de A diretamente para C, e guardar o valor que antes era transferido de A para B ou de B para C. Nesta situao indiferente, j que os dois valores so iguais. Nesta condio a simplificao realizada desta maneira, pois como o valor que transferido de A para B, tambm repassado B para C, ou seja, B no fica com nada do que recebeu ento A pode transferir direto para C e a movimentao de B para C descartada tambm, pois C agora receber o valor diretamente de A. 4.2 Se a condio acima no foi atendida, ento o algoritmo verifica se o valorUm MAIOR valorDois, se sim, ento o seguinte processamento realizado: - m[i, j] que guardava o valor transferido de A para B, guardar o valor de valorUm menos valorDois; - m[j, c] que guardava o valor transferido de B para C, tambm guardar zero; - m[i, c] guardar uma nova transferncia de realizada de A diretamente para C, guardar o valor que antes era transferido de B para C, ou seja, valorDois.

4-

silveira.paulor@gmail.com

4.3 Se a condio acima tambm no foi atendida, ento o algoritmo assume que valorUm MENOR valorDois e executa o seguinte processo: - m[i, j] que guardava o valor transferido de A para B, guardar zero; - m[j, c] que guardava o valor transferido de B para C, guardar o valor de valorDois menos valorUm; - m[i, c] conter o valor de uma nova transferncia de realizada de A diretamente para C, guardar o valor que antes era transferido de B para C, ou seja, valorUm. Os procedimentos descritos acima repetem a cada at que no haja mais nenhuma alterao para ser realizada ou seja, depois que o algoritmo realizar todas as possveis simplificaes para as movimentaes que recebeu de entrada. Abaixo uma pequena ilustrao da sada de uma execuo do algoritmo sobre um grafo construdo por ns:

silveira.paulor@gmail.com

A seguir sero demonstrados todos os resultados obtidos com a execuo do algortimo sobre os casos de testes disponibilizados junto com o enunciado do trabalho. Resultados Segue abaixo os resultados obtidos para os seguintes casos de testes: 1) Primeiro caso de teste: ::TAXA ORIGINAL: 6841.059999999999 :: ::TAXA REDUZIDA: 970.4099999999995 :: ::VALOR ECONOMIZADO: 5870.649999999999 ::
2)

Segundo caso de teste: ::TAXA ORIGINAL: 5689.650000000001 :: ::TAXA REDUZIDA: 1343.0300000000002 :: ::VALOR ECONOMIZADO: 4346.620000000001 ::

3) Terceiro caso de teste: ::TAXA ORIGINAL: 4156.319999999999 :: ::TAXA REDUZIDA: 900.0600000000006 :: ::VALOR ECONOMIZADO: 3256.2599999999984 :: 4) Quarto caso de teste: ::TAXA ORIGINAL: 3609.4300000000003 :: ::TAXA REDUZIDA: 964.2600000000008 :: ::VALOR ECONOMIZADO: 2645.1699999999996 :: 5) Quinto caso de teste: ::TAXA ORIGINAL: 2623.39 :: ::TAXA REDUZIDA: 1542.100000000003 :: ::VALOR ECONOMIZADO: 1081.2899999999968 :: 6) Sexto caso de teste: ::TAXA ORIGINAL: 4394.539999999999 :: ::TAXA REDUZIDA: 1001.6099999999982 :: ::VALOR ECONOMIZADO: 3392.9300000000007 :: 7) Oitavo caso de teste: ::TAXA ORIGINAL: 6036.550000000007 :: ::TAXA REDUZIDA: 1869.180000000002 :: ::VALOR ECONOMIZADO: 4167.370000000004 ::
8)

Nono caso de teste: ::TAXA ORIGINAL: 4388.860000000001 ::

silveira.paulor@gmail.com

::TAXA REDUZIDA: 1299.5200000000002 :: ::VALOR ECONOMIZADO: 3089.34 :: Concluso No inicio da anlise do problema, achamos que o algoritmo seria muito complicado de ser feito, porm com o passar das tentativas, pudemos observar que a soluo do mesmo trivial, j que utilizamos uma matriz como estrutura de dados para representar o grafo que guarda as contas bancrias dos correntistas e suas respectivas movimentaes. Ao estudarmos o algoritmo elaborado e o contexto do desafio, pudemos concluir que a complexidade do algoritmo no pior dos casos O(n), supondo que todos correntistas transferem para todos.

silveira.paulor@gmail.com

Anda mungkin juga menyukai