Dicas para Maratonas de
Programação
Prof. Dr. Anderson Viçoso de Araújo
facom.ufms.br/~andvicoso
2016
Roteiro
 Introdução
 O que é?
 Motivação
 Preparação
 Prova
 BOCA
 Dicas
 Estruturas de dados
 Equipe
 Erros comuns
Introdução
Alongando os dedos...
O que é?
 Competição com diversas equipes de programadores tentando resolver o maior número de
problemas em menor tempo
 Equipes de 3 programadores e 1 reserva
 Toda equipe deve ter um coach (técnico)
 O número de problemas depende da competição (6-15)
 Pode ter problemas em inglês ou todos em inglês
 Existem duas etapas nacionais e a etapa internacional da competição
 Pode render uma viagem...
Dados
 Brasil:
 Começou em 1996;
 2014
 643 times de 199 escolas em 41 sedes
 Vencedores: USP SP, UFCG e UFRJ
 Mundo:
 Começou em 1977 nos EUA
 2015
 38.160 participantes de 2.534 universidades de 101
países (seis continentes)
 Os vencedores dos últimos anos são China e Rússia
Dados (2)
Motivação
 Você está estudando computação, você deveria gostar de programar
 Se não gosta, pode estar no lugar errado…
 Diversas empresas fazem testes similares aos das maratonas de programação para contratar
programadores
 Alguns sites indicam vagas em empresas aos melhores programadores
 É legal competir, né?
 Ganhar melhor ainda!
 A maioria dos eventos tem premiação
 Você disse viagens?
 Algumas até em dinheiro! Uhuu!
Benefícios
 Mantém o raciocínio afiado
 Melhora as habilidades de programação
 Facilita o entendimentos dos conteúdos do curso
 Parece que com o tempo tudo fica mais fácil perto de problemas difíceis da Maratona
 Destaque nacional ou internacional: Os melhores vão para as finais e as grandes empresas sabem
disso!
 Mas claro que tudo depende do treinamento...
Como Se Preparar
 SPOJ (http://br.spoj.com)
 URI Online (http://www.urionlinejudge.com.br)
 CodeForces (http://codeforces.com)
 POJ (http://poj.org)
 UVa (http://uva.onlinejudge.org/)
 TopCoder (http://community.topcoder.com)
 CodinGame (http://www.codingame.com)
Prova
Mandando bala!
Funcionamento da Maratona
 Warmup
 Tem 1 hora de duração
 Em geral, apresenta só um problema fácil para ambientação das equipes, mas pode ter mais de um
 Prova
 Geralmente tem 5 horas de duração
 Podem levar códigos impressos
 Durante a prova:
 Pode sair pra beber água, ir no banheiro e comer
 Não pode acessar outros web sites além do site do BOCA
 Cada equipe que resolver um dos problemas, recebe um balão
 Critério de classificação
 Quantidade de problemas resolvidos
 Quantidade de tempo que cada equipe necessitou para resolver os problemas, em minutos decorridos desde o início
da competição
BOCA
 Problems
 Visualizar as questões da prova
 Runs
 Submeter as suas soluções e receber as respostas dos juízes
 Para submeter uma solução, o time deverá selecionar o problema para o qual a solução foi feita, a linguagem
utilizada e depois carregar o arquivo contendo a solução
 Score
 Mostra o placar atualizado da competição. Vale a pena lembrar que o placar será congelado antes do final da
competição (suspense mantido :-))
 Clarifications
 Essa opção permite que o time faça perguntas aos juízes a cerca de um problema específico ou de algum aspecto
geral da prova
 Tasks
 O time poderá enviar arquivos para impressão
BOCA - Tipos de Respostas
Resposta Descrição
YES Seu programa foi aceito, e você receberá um balão da cor correspondente ao problema.
NO: Incorrect Output
Também conhecido como Wrong Answer. Indica que seu programa respondeu incorretamente
algum(ns) dos testes dos juízes.
NO: Time-limit Exceeded
A execução do seu programa excedeu o tempo permitido pelos juízes. Esse limite de tempo
usualmente não é divulgado aos times e pode variar para cada problema.
NO: Runtime Error
Durante o teste ocorreu um erro de execução (causado pelo seu programa) na máquina dos juízes.
Acesso a posições irregulares de memória ou estouro dos limites da máquina são os erros mais
comuns.
NO: Compilation Error
Seu programa tem erros de sintaxe. Pode ser ainda que você errou o nome do problema ou
linguagem no momento da submissão.
NO: Output Format Error
Também conhecido como Presentation Error, indica que a saída do seu programa não segue a
especificação exigida na folha de questões, apesar do "resultado" estar correto. Corrija para se
adequar à especificação do problema.
NO: Contact Staff Você deve pedir a presença do pessoal de staff, pois algum erro incomum aconteceu.
Como resolver os problemas?
 Conhecer algoritmos e estruturas de dados
 Conhecer bem a equipe e trabalhar em grupo
 Conhecer bem a linguagem
 Conhecer a IDE
Algoritmos e Estruturas de Dados
 Grafos, pilhas, filas, listas, árvores, matrizes, vetores, …
 Recursão, Ordenação, Programação Dinâmica, Algoritmos de Busca, …
 Referências excelentes:
 Algoritmos - Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
 Competitive Programming 3, Steven Halim and Felix Halim
Trabalho em Equipe
 Definam uma estratégia
 Depende da composição da equipe
 Caso tenha um problema que envolva geometria, e tenha um membro da equipe que tenha mais
experiência no assunto, passe pra ele!
 Exemplos:
 Estratégia simples: Mais individualista possível
 Terminal Man: Um fica sempre no computador e os outros vão avaliando os problemas individualmente
 Think Tank: Um no computador e os dois outros focam no mesmo problema
 Lembrando que as estratégias não precisam ser fixas durante a prova
Linguagens
 Conheça os recursos disponíveis da linguagem e use-os ao máximo
 Em particular, você nunca deve ter que implementar um algoritmo de ordenação à mão, por
exemplo
 Saiba como debugar o código na linguagem
 Criar breakpoints, watches, …
 C e C++
 int main deve retornar 0 no final do programa
 Não usar conio.h
 Java
 Nomeie a sua classe com o nome do problema, em geral em minúsculas
 Não se pode usar pacotes
Dicas Gerais
 Comece a prova ordenando/definindo o nível de dificuldade de cada problema
 Se estiver com dificuldade de ordenar, verifique o placar para ver quais problemas as outras equipes estão
resolvendo/tentando resolver
 Não precisa deixar o código bonito, mas tem que estar compreensível
 Use as letras indicadas na descrição do problema para nomear as variáveis
 Occam’s Razor: A solução melhor é sempre a mais simples!
 Muito cuidado com os limites das entradas
 Implementar no papel em pseudo-código antes de passar para o computador
 Cuidado com: Ponteiros, memória, tamanho e tipos das entradas
Dicas Gerais (2)
 Entradas e Saídas dos Problemas
 Termine sempre as suas respostas com uma quebra de linha
 Leve impressos:
 Tabela ASCII
 Códigos mais complexos
 Saiba:
 Métodos de manipulação e formatação de Strings
 Métodos de manipulação e impressão de matrizes
 Melhor dica de todas: PRATICAR!
Submissões
 TESTE BEM o algoritmo antes da submissão
 Os casos de teste não são somente os descritos no problema. São compostos de diversos outros testes.
Pense nisso!
 Submissões erradas somam penalidades no tempo, em geral 20 minutos
Erros Bobos/Comuns
 Crie o seu arquivo-fonte contendo a solução de um problema com o nome indicado no enunciado;
 Escolha a linguagem correta na submissão;
 Lembre-se de que sua solução deve ler os dados da entrada padrão e escrever os resultados na
saída padrão. Nada deve ser escrito na saída padrão de erro;
 Escrita das saídas com espaços adicionais;
Dicas TLE
 Perto de 106 passos, o programa passa
 107 passos tem de ser passos simples passar
 108 normalmente não passa
 Por exemplo,
 se N vai até 100, o ideal é procurar uma solução O(N3) no máximo
 se N vai até 1000, o ideal eh até O(N2)
 ...
Treinamento
 Roteiro: http://wiki.maratona.dcc.ufmg.br/
 Monitor: Lucas Tsutsui (lucastsui@hotmail.com)
 Professores com diferentes temas
 Podemos ter mudanças de horários pontuais para cada professor
 Vamos ter a seleção das equipes
 Inicialmente a ideia é ter 3 equipes
Dúvidas?
Boa Sorte!
Let the carnage begin! (Rock 'N Roll Racing, 1993)

Dicas para maratonas de programação

  • 1.
    Dicas para Maratonasde Programação Prof. Dr. Anderson Viçoso de Araújo facom.ufms.br/~andvicoso 2016
  • 2.
    Roteiro  Introdução  Oque é?  Motivação  Preparação  Prova  BOCA  Dicas  Estruturas de dados  Equipe  Erros comuns
  • 3.
  • 4.
    O que é? Competição com diversas equipes de programadores tentando resolver o maior número de problemas em menor tempo  Equipes de 3 programadores e 1 reserva  Toda equipe deve ter um coach (técnico)  O número de problemas depende da competição (6-15)  Pode ter problemas em inglês ou todos em inglês  Existem duas etapas nacionais e a etapa internacional da competição  Pode render uma viagem...
  • 5.
    Dados  Brasil:  Começouem 1996;  2014  643 times de 199 escolas em 41 sedes  Vencedores: USP SP, UFCG e UFRJ  Mundo:  Começou em 1977 nos EUA  2015  38.160 participantes de 2.534 universidades de 101 países (seis continentes)  Os vencedores dos últimos anos são China e Rússia
  • 6.
  • 7.
    Motivação  Você estáestudando computação, você deveria gostar de programar  Se não gosta, pode estar no lugar errado…  Diversas empresas fazem testes similares aos das maratonas de programação para contratar programadores  Alguns sites indicam vagas em empresas aos melhores programadores  É legal competir, né?  Ganhar melhor ainda!  A maioria dos eventos tem premiação  Você disse viagens?  Algumas até em dinheiro! Uhuu!
  • 8.
    Benefícios  Mantém oraciocínio afiado  Melhora as habilidades de programação  Facilita o entendimentos dos conteúdos do curso  Parece que com o tempo tudo fica mais fácil perto de problemas difíceis da Maratona  Destaque nacional ou internacional: Os melhores vão para as finais e as grandes empresas sabem disso!  Mas claro que tudo depende do treinamento...
  • 9.
    Como Se Preparar SPOJ (http://br.spoj.com)  URI Online (http://www.urionlinejudge.com.br)  CodeForces (http://codeforces.com)  POJ (http://poj.org)  UVa (http://uva.onlinejudge.org/)  TopCoder (http://community.topcoder.com)  CodinGame (http://www.codingame.com)
  • 10.
  • 11.
    Funcionamento da Maratona Warmup  Tem 1 hora de duração  Em geral, apresenta só um problema fácil para ambientação das equipes, mas pode ter mais de um  Prova  Geralmente tem 5 horas de duração  Podem levar códigos impressos  Durante a prova:  Pode sair pra beber água, ir no banheiro e comer  Não pode acessar outros web sites além do site do BOCA  Cada equipe que resolver um dos problemas, recebe um balão  Critério de classificação  Quantidade de problemas resolvidos  Quantidade de tempo que cada equipe necessitou para resolver os problemas, em minutos decorridos desde o início da competição
  • 12.
    BOCA  Problems  Visualizaras questões da prova  Runs  Submeter as suas soluções e receber as respostas dos juízes  Para submeter uma solução, o time deverá selecionar o problema para o qual a solução foi feita, a linguagem utilizada e depois carregar o arquivo contendo a solução  Score  Mostra o placar atualizado da competição. Vale a pena lembrar que o placar será congelado antes do final da competição (suspense mantido :-))  Clarifications  Essa opção permite que o time faça perguntas aos juízes a cerca de um problema específico ou de algum aspecto geral da prova  Tasks  O time poderá enviar arquivos para impressão
  • 13.
    BOCA - Tiposde Respostas Resposta Descrição YES Seu programa foi aceito, e você receberá um balão da cor correspondente ao problema. NO: Incorrect Output Também conhecido como Wrong Answer. Indica que seu programa respondeu incorretamente algum(ns) dos testes dos juízes. NO: Time-limit Exceeded A execução do seu programa excedeu o tempo permitido pelos juízes. Esse limite de tempo usualmente não é divulgado aos times e pode variar para cada problema. NO: Runtime Error Durante o teste ocorreu um erro de execução (causado pelo seu programa) na máquina dos juízes. Acesso a posições irregulares de memória ou estouro dos limites da máquina são os erros mais comuns. NO: Compilation Error Seu programa tem erros de sintaxe. Pode ser ainda que você errou o nome do problema ou linguagem no momento da submissão. NO: Output Format Error Também conhecido como Presentation Error, indica que a saída do seu programa não segue a especificação exigida na folha de questões, apesar do "resultado" estar correto. Corrija para se adequar à especificação do problema. NO: Contact Staff Você deve pedir a presença do pessoal de staff, pois algum erro incomum aconteceu.
  • 15.
    Como resolver osproblemas?  Conhecer algoritmos e estruturas de dados  Conhecer bem a equipe e trabalhar em grupo  Conhecer bem a linguagem  Conhecer a IDE
  • 16.
    Algoritmos e Estruturasde Dados  Grafos, pilhas, filas, listas, árvores, matrizes, vetores, …  Recursão, Ordenação, Programação Dinâmica, Algoritmos de Busca, …  Referências excelentes:  Algoritmos - Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein  Competitive Programming 3, Steven Halim and Felix Halim
  • 17.
    Trabalho em Equipe Definam uma estratégia  Depende da composição da equipe  Caso tenha um problema que envolva geometria, e tenha um membro da equipe que tenha mais experiência no assunto, passe pra ele!  Exemplos:  Estratégia simples: Mais individualista possível  Terminal Man: Um fica sempre no computador e os outros vão avaliando os problemas individualmente  Think Tank: Um no computador e os dois outros focam no mesmo problema  Lembrando que as estratégias não precisam ser fixas durante a prova
  • 18.
    Linguagens  Conheça osrecursos disponíveis da linguagem e use-os ao máximo  Em particular, você nunca deve ter que implementar um algoritmo de ordenação à mão, por exemplo  Saiba como debugar o código na linguagem  Criar breakpoints, watches, …  C e C++  int main deve retornar 0 no final do programa  Não usar conio.h  Java  Nomeie a sua classe com o nome do problema, em geral em minúsculas  Não se pode usar pacotes
  • 19.
    Dicas Gerais  Comecea prova ordenando/definindo o nível de dificuldade de cada problema  Se estiver com dificuldade de ordenar, verifique o placar para ver quais problemas as outras equipes estão resolvendo/tentando resolver  Não precisa deixar o código bonito, mas tem que estar compreensível  Use as letras indicadas na descrição do problema para nomear as variáveis  Occam’s Razor: A solução melhor é sempre a mais simples!  Muito cuidado com os limites das entradas  Implementar no papel em pseudo-código antes de passar para o computador  Cuidado com: Ponteiros, memória, tamanho e tipos das entradas
  • 20.
    Dicas Gerais (2) Entradas e Saídas dos Problemas  Termine sempre as suas respostas com uma quebra de linha  Leve impressos:  Tabela ASCII  Códigos mais complexos  Saiba:  Métodos de manipulação e formatação de Strings  Métodos de manipulação e impressão de matrizes  Melhor dica de todas: PRATICAR!
  • 21.
    Submissões  TESTE BEMo algoritmo antes da submissão  Os casos de teste não são somente os descritos no problema. São compostos de diversos outros testes. Pense nisso!  Submissões erradas somam penalidades no tempo, em geral 20 minutos
  • 22.
    Erros Bobos/Comuns  Crieo seu arquivo-fonte contendo a solução de um problema com o nome indicado no enunciado;  Escolha a linguagem correta na submissão;  Lembre-se de que sua solução deve ler os dados da entrada padrão e escrever os resultados na saída padrão. Nada deve ser escrito na saída padrão de erro;  Escrita das saídas com espaços adicionais;
  • 23.
    Dicas TLE  Pertode 106 passos, o programa passa  107 passos tem de ser passos simples passar  108 normalmente não passa  Por exemplo,  se N vai até 100, o ideal é procurar uma solução O(N3) no máximo  se N vai até 1000, o ideal eh até O(N2)  ...
  • 24.
    Treinamento  Roteiro: http://wiki.maratona.dcc.ufmg.br/ Monitor: Lucas Tsutsui (lucastsui@hotmail.com)  Professores com diferentes temas  Podemos ter mudanças de horários pontuais para cada professor  Vamos ter a seleção das equipes  Inicialmente a ideia é ter 3 equipes
  • 25.
    Dúvidas? Boa Sorte! Let thecarnage begin! (Rock 'N Roll Racing, 1993)

Notas do Editor

  • #12 Equipes que resolveram a mesma quantidade de problemas são classificadas em ordem crescente de tempo: quem gastou menos tempo aparece antes de quem gastou mais tempo;