Material de treino

Aprender a programar

Para quem ainda não sabe programar

Para quem quer começar a participar em concursos de informática, é importante começar com aprender a programar. Notem que aprender a programar é a parte "fácil" dos concursos, é apenas uma ferramenta para atingir um fim.

Para aprender C/C++, recomendamos o seguinte:

Para aprender Java:

Iniciação aos concursos

Para quem ainda já programa, mas nunca participou em concursos

Depois de dominar os básicos de programação, estão prontos para começar a resolver problemas de concursos. Um concurso de programação consiste num conjunto de problemas a resolver. Muito resumidamente, cada problema tem um determinado input e o objetivo é seguir as instruções do enunciado para produzir um código que computa um determinado output. Para garantir que o programa faz o esperado, ele é corrido em vários exemplos de input e o output que ele gera é comparado com o esperado. O objetivo é acertar todos estes exemplos a que chamamos de casos de teste.

Um aspeto importante para começar a participar em concursos de programação, é perceber que os problemas a resolver não são avaliados apenas pela correção. O objetivo é chegar à melhor solução possível a nível de eficiência, ou seja, do quão rápido é o programa resolver o problema para os vários casos de teste.

Para resolver um problema, recorremos a algoritmos e estruturas de dados. Um algoritmo não é mais que um conjunto de instruções a serem executadas, enquanto que uma estrutura de dados é uma forma de representar um conjunto de dados de maneira a facilitar o seu acesso. Quando queremos resolver um problema, temos de pensar no algoritmo que usaremos para o resolver e que estruturas de dados podemos usar para representar o input ou valores intermédios do nosso algoritmo.

Antes de começarmos a aprender vários algoritmos e estruturas de dados, é importante aprender a estimar o comportamento de um algoritmo e assim perceber se ele resolve o problema que queremos resolver. Para tal, comecem por aprender o conceito de complexidade algorítmica ou como analisar algoritmos. Depois disto, estão prontos para começar a resolver problemas.

Para uma outra análise, mais completa, sobre o que constitui um concurso de programação, leiam a primeira resposta aqui: https://www.quora.com/What-is-competitive-programming-2.

De iniciante a avançado

Para quem já sabe os básicos, mas quer aprender o máximo

Além do loop, existem imensos sites, livros, artigos e problemas para aprender. Eis uma lista de alguns dos melhores:

Há muito mais conteúdo por ai, isto é só um pequeno resumo. Nos vários guias do loop usamos todos estes recurso e outros mais para vos apresentar cada tópico. Se quiserem uma lista ainda mais extensa experimentem ver esta.


Repositórios de concursos e de problemas

USACO (concursos)

A plataforma oficial das olimpíadas americanas de informática. Além de organizar 4 a 5 concursos estilo IOI (ou estilo ONI) por ano, divididos por categorias de dificuldade, contém uma listagem de problemas de concursos de anos anteriores, assim como as suas soluções e os casos de teste dos problemas. Adicionalmente, têm uma plataforma de treino com vários problemas (submetíveis na plataforma) e textos teóricos interessantes.

É altamente recomendada participação nos concursos da USACO, assim como o uso da plataforma de treino, pois além de serem de excelente qualidade são feitos por pessoas ligadas a olimpíadas e os concursos são feitos ao estilo olímpico.

COCI (concursos)

O COCI (Croatian Open Competition in Informatics) é uma plataforma croata que organiza 7 a 8 concursos anuais ao estilo IOI/ONI. Os problemas de cada concurso são ordenados por dificuldade, sendo os primeiros muito simples (até para iniciantes), ficando progressivamente mais difíceis. Além dos problemas, é possível encontrar soluções detalhadas assim como os casos de teste de concursos passados.

É altamente recomendada participação nos concursos do COCI, são uma forma excelente de preparação olímpica.

CodeForces (concursos + problemas)

O CodeForces é uma plataforma de programação competitiva, que organiza vários concursos por mês e tem um vasto repositório de problemas de concursos antigos, assim como editoriais com soluções para a maior parte dos problemas. Tem também uma parte social, onde os utilizadores publicam artigos estilo blog e discutem uns com os outros, onde se podem encontrar vários artigos com textos teóricos interessantes de programação competitiva, anúncios de outros concursos...

É possivelmente a plataforma de programação competitiva com mais utilizadores e mais conteúdo original, apesar de ser mais direcionada a concursos universitários, a participação nos seus concursos é muito recomendada (e é também de notar que muitas sugestões de problemas do loop são de problemas desta plataforma, por ser muito fácil de os submeter e existirem imensos recursos para auxílio à resolução).

TopCoder (concursos + problemas)

O TopCoder é uma plataforma de concursos de programação de vários tipos, sendo que um deles é a programação competitiva (contém ainda concursos de desenvolvimento de software, de resolução de problemas de otimização ou de data mining...). Organiza todos os meses vários concursos além de um "super concurso" (o TopCoder Open) de várias rondas todos os anos. Os concursos são normalmente muito curtos e contém problemas mais fáceis na divisão 2 e mais complicados na divisão 1.

Esta plataforma é a mais antiga de concursos do género e tem muitos problemas de concursos passados de qualidade, assim como soluções para muitos deles. Porém, apesar de ser sempre positivo mais treino, as plataformas acima são mais recomendadas.

UVa (problemas)

O online judge da Universidade de Valladolid é o repositório de problemas de competição mais antigo. Contém milhares de problemas de várias naturezas.

Apesar de já ser um pouco antigo, tem vários problemas de alta qualidade e muitos deles serão usados como exemplos a resolver em artigos do loop.

SPOJ (problemas)

O Sphere online judge é um repositório de problemas ao estilo do UVa, mas mais recente. Contém milhares de problemas de excelente qualidade.