Programando melhor: Exercícios 1 (Parte I)
Agora é a hora da diversão!!!
Bem pessoal, como prometido, chegou hoje a primeira bateria de exercícios do nosso curso “Programando melhor”, para você que deseja se tornar um melhor programador/competidor. Além disso, venho compartilhar com vocês a enorme vantagem nesse tipo de competição de quem domina bem a matemática (em competições também), pois hoje tive mais uma aula do Programa de Iniciação Científica OBMEP 2007 e fiquei ainda mais amando essa matéria (o que me faz gostar cada vez mais de programação pesada!). Mas vamos pôr a mão na massa!
Problema 1: The 3n+1 Problem (O problema do 3n+1)
UVa ID (código no site da Universidad de Valadollid): 100 ; Nível: Fácil
Considere o seguinte algoritmo para gerar uma sequência de números. Comece com um inteiro n. Se n é par, divida por 2. Se n é ímpar, multipique por 3 e some 1. Repita esse processo com o novo valor de n, terminando quando n = 1. Por exemplo, a seguinte sequência de números será gerada a partir de n = 22.
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
É conjecturado (mas ainda não provado) que esse algoritmo terminará em n=1 para qualquer inteiro n. Ainda, a conjectura assegura para todos os inteiros até 1 milhão.
Para uma entrada n, o tamanho do ciclo de n é o número de números gerados, incluindo o 1. No exemplo acima, o tamanho do ciclo de 22 é 16. Dados qualquer dois números i e j, você deve determinar o maior tamanho do ciclo dentre todos os inteirosdf entre i e j, incluindo ambos os extremos.
Entrada
A entrada consistirá numa série de pares de inteiros i e j, um par de inteiros por linha. Todos os inteiros serão menores do que 1 milhão e maiores que 0.
Saída
Para cada par de inteiros i e j, coloque i e j na mesma ordem que eles apareceram na entrada e então o maior tamanho de ciclo para todos os inteiros entre e incluindo i e j. Esses três números devem estar separados por um espaço, com todos os três números em uma linha e com uma linha de saída para cada linha de entrada.
Exemplo de entrada/saída
Entrada -> 1 10 ; Saída -> 1 10 20
Entrada -> 100 200 ; Saída -> 100 200 125
Entrada -> 201 210; Saída ->201 210 89
Entrada -> 900 1000 ; Saída -> 900 1000 174
Problema 2: The Trip (A Viagem)
UVa ID: 10137 ; Nível: Fácil
Um grupo de estudantes são membros de um clube que viaja anualmente para diferente locais. Os destinos deles no passado incluem Indianapolis, Phoenix, Nashville, Philadelphia, San Jose e Atlanta. Essa primavera eles estão planejando uma viagem para Eindhoven.
O grupo concorda a princípio compartilhar as despesas igualmente, mas não é prático compartilhar cada despesa no momento em que ela ocorre. Então indivíduos no grupo pagam por certas coisas, como refeições, hotéis, táxi e passagens aéreas. Depois da viagem, as despesas de cada estudante são contadas e o dinheiro é trocado para que o custo líquido para cada um seja o mesmo, para cada centavo. No passado, esse dinheiro trocado foi tedioso e consumiu muito tempo. Seu trabalho é computar, de uma lista de despesas, a quantia mínima de dinheiro que deve trocar de mãos em virtude de igualar (com diferença máxima de 1 centavo) todos os custos dos estudantes.
Entrada
A entrada padrão irá conter a informação para diversas viagens. Cada viagem consiste de uma linha contendo um inteiro positivo n, o qual representa o número de estudantes na viagem. Isso é seguido por n linhas de entrada, cada uma contendo a quantia gasta pelo estudante em dólares e centavos. Não há mais do que 100 estudantes e os estudantes não irão gastar mais do que $10.000,00 cada. Uma linha contendo 0 segue a informação da última viagem.
Saída
Para cada viagem, forneça uma linha de saída informando a quantia total de dinheiro, em dólares e centavos, que deve ser trocada para igualar os custos dos estudantes.
Exemplo de entrada
3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
Exemplo de saída (correspondente à entrada acima)
$10.00
$11.99
Bem pessoal, agora mesmo irei colocar a Parte II desses exercícios, com mais um do nível Fácil e outro do nível Médio, ok? Fiquem à vontade para perguntar e, com certeza, dar dicas para a resolução dos problemas. Soluções completas dos problemas não serão aceitas em comentários, pois (após discutir com algumas pessoas) seria algo que tiraria a “graça” dos problemas propostos, porém qualquer dica a respeito é bem-vinda! Além disso, eu mesmo irei postar as minhas dicas quando eu pegar esses problemas pra valer (amanhã), blz?
Posts interessantes:
- Programando melhor: Exercícios 1 (Parte II)
- Programando melhor: Aula 1 – Começando
- Cursos grátis na Internet – MIT
- Top Coder Marathon Matches
- Olimpíadas do Conhecimento
Helton de Melo Duarte
“A sabedoria é a coisa principal: adquire, pois, a sabedoria; sim, com tudo o que possuis adquire o entendimento. Estima-a e ela te exaltará; se a abraçares, ela te honrará. Ela dará à tua cabeça uma grinalda de graça; e uma coroa de glória te entregará.” (Provérbios 4.7-9)
Programando melhor: Aula 1 – Começando
Finalmente pessoal!
Hoje irá iniciar o curso de programação focado em competições existentes em todo o mundo. O curso terá como título “Programando melhor” e será composto de aulas iniciantes até programação pesada! Vamos embarcar comigo nessa empreitada!
Aula 1 – Começando
Conteúdo: introdução a competições de programação, assim como dicas iniciais e cuidados a serem tomados na criação de soluções para os problemas apresentados.
Existem por aí alguns sites que podem nos ajudar a exercitar nossos conhecimentos, pois disponibilizam juízes online para testar a eficiência do seu programa. Os principais sites para esse tipo de exercício são o da Universidad de Valladolid, o da Olimpíada Brasileira de Informática e o do livro Programming Challenges (base para o desenvolvimento desse curso). Cadastre-se neles (com excessão do site da OBI, que não precisa de cadastro) e comece a testar soluções para os mais diversos programas encontrados, inclusive para os exercícios que serão propostos aqui.
Como primeiro passo rumo a sua vitória em diversas dessas competições, você precisará primeiramente escolher em qual linguagem desenvolverá seus programas. Eu recomendo o C, pois é de fácil entendimento (sem a orientação a objeto presente no C++/Java) e é aceito em praticamente todas as competições. Pascal é uma boa recomendação apenas para quem está no ensino médio e deseja participar da OBI (pois é uma das únicas que ainda permite essa linguagem); Java é desagradável pela sua POO (programação orientada a objeto), algo bastante desagradável quando não se vai trabalhar com programas grandes os quais precisariam de reaproveitamento de algumas partes; C++ é aconselhável a programadores mais experientes, desejosos de participar do TopCoder (não aceita o C).
É preciso também tomar cuidados com algumas práticas do nosso dia-a-dia na programação que não devem ser praticadas por um competidor. Primeiramente, as entradas e saídas do seu programa devem ser exclusivamente as padrões, ou seja, não é permitida a abertura de arquivos ou funções desse estilo durante a programação. Já para programadores Java funções de internet e threads não são permitidas, além de nada poder ser público, até mesmo o Main, contudo pacotes como math, util e similares são possíveis.
Dicas de programador para programador:
- Comece seu programa e cada uma das funções criadas comentando cada passo a ser realizado, pois isso facilitará seu entendimento do problema (se você não conseguir fazer isso, então não está entendendo o que é preciso fazer no programa). Esse esforço extra irá ajudar muito no futuro…
- Faça o mesmo para cada variável, explicando qual será sua “função” no programa (não é preciso colocar nomes gigantes, como ModuloDoQuadradoDoVetorResultante, apenas comente bem (não é Elomar e Bryan? hehehehehe).
- Crie, sempre que possível, constantes para representar números bastante utilizados no programa, como PI, TAMVETOR, etc., isso irá prevenir erros futuros e deixará BEM mais legível seu código (ajudando a encontrar bugs que possam aparecer).
- Eficácia. Essa é a base para competições de progração (e para sua vida de programador). Evite ao máximo códigos redundantes, como
- if (x == ‘A’) Código
- else if (x == ‘B’) Código quase igual;
- Além do mais (nunca pensei que iria falar isso na minha vida xD ): evite GAMBIARRAS! Você pode achar o máximo quando você faz uma daquelas bem grotescas, todavia isso pode lhe causar um belo de um “Time Limit Exceeded”, ou seja, seu programa pode ficar lento e não ser executado no tempo máximo permitido (é, existe um tempo máximo!). ^^
- Por fim, é de extrema importância o conhecimento na arte de “DEBUGGAR”, ou seja, conheça o sistema de Debug do seu compilador ou faça isso manualmente (mandando imprimir o valor de certa variável em um determinado local – CUIDADO com doideras no código ao fazer isso). Esse item é muito bom caso receba alguma mensagem de erro do sistema de correção.
Um bom caminho a seguir é o de evitar tipos de dados não elementares, como POO, e até a utilização excessiva de ponteiros em C, o que pode gerar erros inesperados, sendo sempre bom recorrer aos bons e velhos Vetores. Tome também cuidados com Records/Structs/Registros, pois eles podem gerar uma grande dor de cabeça na hora de precisar alterar o seu código.
Bem, gostaria de finalizar esse post com um alerta para aqueles os quais desejam participar da OBI, pois durante a competição você não tem o acesso ao juiz dizendo se o seu programa passou nos testes ou não, isso só é disponibilizado na seção Pratique do site, portanto é necessária a sabedoria para você mesmo criar testes que poderiam dar erro em um programa, ok?
Os exercícios seguem no próximo post e eles estão todos disponibilizados no UVa Online Judge, para serem testados. Eles correspondem aos problemas do Capítulo 1 do livro Programming Challenges, de autoria de Miguel Revilla e Steven Skiena.
Posts interessantes:
- Programando melhor: Exercícios 1 (Parte I)
- Programando melhor: Exercícios 1 (Parte II)
- Curso de Programação – Confirmado!
- Cursos grátis na Internet – MIT
- Top Coder Marathon Matches
- Olimpíadas do Conhecimento
E você, o que achou dessas dicas? Está pronto para começar essa jornada e se tornar um competidor dos mais fortes? Deixe seu comentário e tire as suas dúvidas!
Helton de Melo Duarte
“Porém o SENHOR disse a Samuel: Não atentes para a sua aparência, nem para a altura da sua estatura, porque o tenho rejeitado; porque o SENHOR não vê como vê o homem. Pois o homem vê o que está diante dos olhos, porém o SENHOR olha para o coração.” (1 Samuel 16.7)