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:

Para aprender Python:

Iniciação aos concursos

Para quem 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.

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 (conteúdo em inglês):


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).

AtCoder (concursos)

Uma plataforma japonesa que organiza concursos semanais, incluindo um mais para iniciantes.

CSES (problemas)

Um repositório de problemas de excelente qualidade e organizados por tópicos, desde os mais introdutórios aos mais avançados.

DM:OJ (problemas)

Um repositório de problemas onde costumam ser incluidos os problemas das IOI.

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.