introdução à maratona de programação · introdução à maratona de programação v. 1.2...

16
Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para a maratona de progra- mação da Universidade Federal do Paraná! Aqui apresenta- mos uma orientação inicial do que é programação competitiva, como funcionam as principais competições e como nos prepa- ramos para este grande desafio.

Upload: others

Post on 02-Oct-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

Introdução à Maratona deProgramação

v. 1.2

Fernando Kiotheka e Raul Almeida

2020

1 IntroduçãoBem-vindo ao grupo de estudos para a maratona de progra-mação da Universidade Federal do Paraná! Aqui apresenta-mos uma orientação inicial do que é programação competitiva,como funcionam as principais competições e como nos prepa-ramos para este grande desafio.

1

Page 2: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

1.1 “A” Maratona de Programação (da SBC, ICPC)

Existem muitas competições de programação de diversos tipose tamanhos. A principal quando se é estudante de graduação éa Maratona de Programação da SBC (Sociedade Brasileira deComputação). Nela, times de três estudantes cada represen-tam suas universidades em uma competição regional e outranacional. Em seguida, as equipe classificadas participam da fi-nal mundial da ICPC (International Collegiate ProgrammingContest), organizada pela ACM (Association for ComputerMachinery), que sempre acontece em um país diferente.

2

Page 3: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

1.2 Olimpíada Brasileira de Informática

A Olimpíada Brasileira de Informática é outra maratona orga-nizada pela UNICAMP com o objetivo de despertar o interesseno estudo da computação. Ela é aplicada como a Olimpíadade Física e de Matemática, para o ensino fundamental e parao médio, mas também para o ensino superior.

A modalidade que você calouro de computação poderá par-ticipar é da nível Sênior na Modalidade Programação. Ela sópode ser feita no primeiro ano de graduação, e diferente dasoutras maratonas, o feedback das respostas e a sua pontuaçãofica disponível apenas alguns dias depois.

É necessário um conhecimento mínimo de programação epara se classificar, até certo domínio de certas estruturas dedados e algoritmos. Poderá ser usado Pascal, C, C++, Java,Javascript e Python como linguagens de programação e a provaé feita individualmente, sem consulta a materiais externos.

3

Page 4: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

2 MotivaçãoExistem muitos motivos pelos quais você pode ter se interes-sado pela maratona, e muitos outros que movem outros com-petidores, mas em uma coisa todos concordarão: participar damaratona de programação é tudo de bom!

Aqui, reunimos alguns dos motivos mais comuns, imagi-nando que você possa querer adicioná-los à sua lista.

2.1 DINHEIRO (Mercado de trabalho)

Grandes empresas de tecnologia participam dos principais even-tos de programação competitiva em busca de pessoas para con-tratar. Se você é bom competidor, você é muito bom progra-mador; e é isso que eles querem!

2.2 Viagens

As competições te permitem conhecer muitos lugares diferen-tes. Como cada etapa é em um lugar, quanto melhor seu de-sempenho mais longe você poderá ir! Veja por onde a UFPRjá passou:

• Florianópolis• Belo Horizonte• Vitória• Estocolmo• Campinas• Joinville• Orlando• Goiânia

• Varsóvia

• Londrina

• Ponta Grossa

• Uberlândia

• Fortaleza

• Foz do Iguaçu

• Campina Grande

4

Page 5: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

2.3 Camisetas e balões

Veja estes competidores da UFPR. Veja como estão felizes.

2.4 Resolução de problemas

Na programação competitiva, você é levado a trabalhar commuitos problemas, todos muito diferentes. Pensar no melhoralgoritmo para resolvê-los lhe traz melhoras no foco e na reso-lução de problemas.

2.5 Conceitos da computação

Estudando para a maratona, você encontrará bem cedo con-ceitos que o curso de graduação só vai oferecer mais tarde; issoimplica em facilidade em algumas disciplinas que não deviamser tão fáceis assim, isso sem contar em aprender coisas que osprofessores não vão nem mencionar!

5

Page 6: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

2.6 Trabalho em equipe

A maratona da SBC e da ICPC é obrigatoriamente feita emgrupos de três pessoas. A escassez de recursos e tempo frenteaos difíceis desafios dessas competições te permite desenvolveruma boa dinâmica de equipe e se divertir com seus colegas.

Nestas maratonas, cada equipe só fica com um computa-dor, e vocês precisam se organizar para pensar na solução dosproblemas de maneira eficiente, e também para digitar, testare enviar.

3 UFPR na MaratonaA UFPR tem história na maratona. Nós já fomos para 11finais nacionais e 3 finais mundiais.

Se o pessoal que estudou aqui 10 anos atrás - comendo nomesmo RU, tendo aula com os mesmos professores, usando osmesmos laboratórios conseguiu, você também consegue!

6

Page 7: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

4 Como treinar

4.1 Preciso saber alguma linguagem específica?

As linguagens de programação que são usadas em competiçõessão muito variadas. Na Maratona da SBC, que é nosso foco,são aceitas cinco: C++, Java, Python, C e Kotlin. E apesarde muitas pessoas utilizarem Python para problemas simplesque não precisam de muito desempenho, as linguagens maispopulares são C++ e Java.

Aqui na UFPR (e, na verdade, em boa parte do Brasil)a preferência é por C++. Isso porque ela vem com muitasbaterias incluídas na sua biblioteca padrão, livrando você dedigitar muito código. E note que no curso de BCC não seráensinado C++, apenas C, que é a base – mas você poderáfazer boa parte dos trabalhos em C++ e terminar antes dos

7

Page 8: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

seus colegas.E se você não sabe programar, não se preocupe! Todo

mundo esteve em sua posição um dia. Nas próximas seções,você encontrará dicas para aprender a usar C++ para progra-mação competitiva.

4.2 O que eu posso levar e usar na competição?

Apenas material impresso, assim como livros e apostilas. Oque levar faz parte da estratégia da sua equipe, pois não háacesso à internet, e as ferramentas disponíveis são as mesmaspara todos os competidores.

Sempre, o ambiente trará um editor de texto como Gedit,vim e emacs, e vem sendo cada vez mais popular as competiçõestambém contarem com IDEs como as da JetBrains como CLione PyCharm (porém verifique antes para ter certeza!).

4.3 Formato de uma competição genérica

Todas as competições de programação seguem um padrão claroe simples. Sempre consistem em um número de problemas, nãonecessariamente em ordem de dificuldade, os quais você poderesponder em qualquer ordem.

Os problemas são de entrada e saída textuais, isto é, emtodos eles você deve escrever um programa que lê uma entradaem formato específico, faz alguma coisa e escreve uma saídaem outro formato também especificado.

Nenhum dos desafios exige que você crie janelas bonitas,uma página web ou que você mexa com impressoras. O focoé nos algoritmos e nas estruturas de dados, sendo que não épermitido fazer uso de programas do sistema (por exemplo,chamar o grep).

8

Page 9: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

A resposta que você submete pode ser uma de duas (e aídepende da competição): o código-fonte – o programa – oua resposta para um problema ou enigma. E você verá que oprimeiro caso é bem mais comum.

No caso da entrega do código-fonte, o seu programa é exe-cutado e avaliado por um juiz automatizado (e existem muitosdesses juízes online). Ele testará seu programa com diversasentradas e então lhe entregará um resultado, que será um dosseguintes:

AC – AcceptedSeu programa resolve o problema;

WA – Wrong AnswerSeu programa entregou uma resposta incorreta em pelomenos um dos casos de teste;

TLE – Time Limit ExceededSeu programa passou do limite de tempo que o problemaaceita;

CE – Compilation ErrorSeu programa não compilou;

RE – Runtime ErrorSeu programa falhou durante a execução.

E isso é tudo. Na competição, o juiz não vai te mostraro teste que deu errado, ou qual linha do seu programa deuerro, descobrir o porquê é sua responsabilidade! Mas não sepreocupe, você poderá arrumar seu código e submeter ele denovo.

Seu objetivo é alcançar o máximo de respostas corretas ouACs e evitar os erros, porque eles te trazem penalidades quesão usadas para desempatar competidores.

9

Page 10: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

4.4 Online Judges

Online Judges (OJs) são sistemas juiz que te dão problemas,recebem submissões e testam o seu programa, sendo que elestambém são usados nas competições.

4.4.1 Codeforces

O Codeforces (CF) é um site russo muito famoso entre os pra-ticantes da programação competitiva. Contando com milharesde problemas, nele acontecem diversos contests que são com-petições virtuais toda semana.

Seus problemas são mais difíceis, no entanto, apresentammuitas oportunidades para aprender; os problemas são orde-nados por dificuldade, o que ajuda muito no seu treino (veja aseção Onde Aprender).

Cada usuário tem um rating, que é alterada (para mais oupara menos) depois da participação em contests. Essa altera-ção funciona num sistema elo e depende tanto do desempenhodo usuário quanto de todos os outros participantes do contest.

E depois dos contests, o Codeforces sempre libera um edi-torial: uma explicação de solução para cada um dos problemas(muitas vezes com exemplos de implementações), que tambémajda a você descobrir novas técnicas.

4.4.2 AtCoder

O AtCoder é um juiz japonês muito semelhante ao CF (tudoque se disse sobre o Codeforces vale aqui, exceto pela popula-ridade e país de origem).

E além disso, o AtCoder sedia semanalmente os AtCoderBeginner Contests, ou ABCs, que têm problemas bem maisfáceis que os do Codeforces (embora eles ainda sejam bem va-riados e interessantes para o seu aprendizado).

10

Page 11: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

4.4.3 URI

O URI é um juiz brasileiro que oferece todos os problemas dascompetições anteriores da SBC, assim como um catálogo diver-sificado de problemas, sendo todos eles formatados de formamais parecida com o das competições que ocorrem aqui noBrasil.

O grande problema é que ele não é modelado para facilitar oaprendizado, sem editorais, soluções e com poucas discussões.Porém, ele é ótimo principalmente para praticar a leitura dosproblemas da SBC que trazem uma historinha de alguns pará-grafos que serve apenas para te distrair, um formato diferentedaquele encontrado, por exemplo, no CodeForces.

4.5 Como aprender

Cada pessoa aprende de um jeito, mas existem alguns padrões:

PraticarO único jeito de fixar o seu conhecimento é praticando.O conceito mais difícil não é nada perto dos problemasonde ele é aplicado: por isso, pratique. É normal terreceio de errar e falhar, mas a maratona te ensina queisso faz parte do aprendizado. Seu objetivo é melhorar,então vá lá e se esforce para isso! Você pode:

Fazer contestsSe colocar num ambiente parecido com o de compe-tição com um tempo limite e com pessoas ao seuredor te prepara para resolver problemas rapida-mente.

Organizar e fazer uma lista de problemasVários competidores tem uma planilha com diver-

11

Page 12: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

sos problemas que eles desejam resolver porque fo-ram recomendados por outros competidores. Ge-ralmente os problemas têm certas peculiaridades ouvárias maneiras de serem resolvidos, sendo um bomexercício para praticar.

Dar aula, escreverO melhor jeito de ter certeza que aprendeu é ensinandoseus colegas. Na hora de formular as explicações, o con-teúdo fixará melhor na sua cabeça e as dúvidas de seuscolegas levará você a pesquisar coisas diferentes. Não te-nha medo de não saber alguma coisa, ninguém nasceusabendo de tudo!

EstudarSaber exatamente como funcionam as diversas estruturasde dados, a teoria dos números, combinações e grafos teajudará muito em como resolver problemas. Todo ano,por exemplo, a Unicamp organiza uma escola de verãopara ensinar diversas técnicas diferentes, e as quais asaulas você pode encontrar no YouTube na próxima se-ção. Em geral, pode se dizer que a maratona é só umadesculpa pra estudar.

UpsolveSe você não conseguir resolver um problema, espere umpouco antes de buscar a solução! Tente abstrair o pro-blema por alguns minutos ou horas para descobrir exa-tamente qual é a essência do problema que você precisaresolver. Depois de pensar bastante, a solução que outrapessoa escreveu vai encaixar como uma luva, porque aívocê poderá equipar o seu arsenal com uma técnica nova,que você poderá testar pra ver se resolve um problemamenos específico do que o original.

12

Page 13: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

RefletirEsqueça o problema por um tempo, dê um tempo parao seu cérebro descansar. Depois de alguns dias ou atémesmo no mesmo dia, uma ideia nova pode aparecer paravocê no banho, no almoço ou no caminho de casa. Vocêse surpreenderá!

4.6 Onde aprender

4.6.1 Canais Educacionais no YouTube

MaratonUSP1

Aulas do grupo de maratona da USP

Aulas de algoritmos da Universidade de HarvardConteúdo de computação com explicação de algoritmose estruturas de dados avançadas

Aulas do curso de verão da UnicampTodas as aulas de preparação paras as finais da maratonadadas na Unicamp

Algorithms Live! (em inglês)Canal com várias aulas sobre o uso de diversos algoritmose estruturas de dados

Errichto (em inglês)Canal de um grande competidor

1As aulas da playlist "Bixecamp" têm o básico de C++ e programação

13

Page 14: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

4.6.2 Livros

Felix Halim, Steven Halim. Competitive Programming 3 (eminglês)Livro excelente, com muitas dicas e com muitas listas deproblemas para resolver no UVA.

Steven Skiena. Programming Challenges: The ProgrammingContest Training Manual (em inglês)Uma boa referência, talvez um pouco desatualizada mastem uma introdução de diversas áreas da computação.

4.6.3 Outros recursos

CP-AlgorithmsEnciclopédia de algoritmos excelente com diversos tópi-cos em grande detalhe.

Geeks for Geeks2

Um pouco de tudo, rico em conteúdo; cuidado com im-plementações erradas!

Neps Academy3

Cursos, listas de exercício e discussão. Definitivamente osite mais bonito que você vai ver listado neste livreto.

C++ Reference (em inglês)Site de referência para as bibliotecas padrão do C++.

CodemonkSite com tutoriais sobre diversos tópicos e problemas re-comendados

2Muitos tutoriais para aprender C++3Curso de C++ para programação competitiva

14

Page 15: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

uDebugSite com entradas e saídas submetidas por usuários paratestar os seus programas com suporte a vários judgesdiferentes

Stanford: Introduction to Programming Contests (em inglês)Aula de Stanford de introdução a maratona com muitosslides e conteúdo bom

TopCoder: Competitive Programming TutorialsUma porção de tutoriais de maratona

LeetCodeUma plataforma de aprendizado para se preparar paraentrevistas técnicas

4.6.4 Outros OJs

ICPC Live ArchiveArquivo com problemas usados nas regionais e nas finaisda ICPC.

VJudgeMeta-OJ que agrupa os problemas de vários outros OJsem uma só plataforma para realizar competições

TopCoderOJ de competição para empresas

UVAUsado pelo livro do Halim, está passando por dificuldadese é impossível se registrar, use o VJudge

SPOJJudge antigo com uma infinidade de problemas diferentes

15

Page 16: Introdução à Maratona de Programação · Introdução à Maratona de Programação v. 1.2 Fernando Kiotheka e Raul Almeida 2020 1 Introdução Bem-vindo ao grupo de estudos para

TimusArquivo russo com muitos problemas

Facebook HackerCupCompetição de programação do Facebook

Code JamCompetição individual do Google com problemas muitodifíceis.

Hash CodeCompetição em equipe do Google para resolver proble-mas complexos com várias partes móveis.

KickStartCompetição para desenvolver habilidades de programa-ção do Google.

16