Slide 1

Slide 1 text

How to get away with algorithms como ir bem em testes técnicos de processos seletivos com juízes eletrônicos

Slide 2

Slide 2 text

Bruna Moreira Engenheira de software PyLadies DF Fundadora da BOSS Forrozeira descrição: foto estilo retrato, mulher branca com cabelos ondulados e curtos. Está sorrindo e com uma camiseta laranja. Aprendendo libras Sinto falta de dançar e cantar no karaokê. Mas tenho meus gatos, então está tudo bem :P

Slide 3

Slide 3 text

Desafios técnicos

Slide 4

Slide 4 text

https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 5

Slide 5 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 6

Slide 6 text

Sem desespero https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 7

Slide 7 text

Contexto https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 8

Slide 8 text

Entrada https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 9

Slide 9 text

Saída https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 10

Slide 10 text

Tempo limite https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 11

Slide 11 text

Sem desespero https://www.urionlinejudge.com.br/judge/pt/runs

Slide 12

Slide 12 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 13

Slide 13 text

Executar Executar é simples! $ python a.py $ python a.py < a.in $ python a.py < a.in > a.out $ diff a.out a.ans

Slide 14

Slide 14 text

Executar Executar é simples! Inserir input o tempo todo? $ python a.py $ python a.py < a.in $ python a.py < a.in > a.out $ diff a.out a.ans

Slide 15

Slide 15 text

Executar Executar é simples! Inserir input o tempo todo? Ótimo! $ python a.py $ python a.py < a.in $ python a.py < a.in > a.out $ diff a.out a.ans

Slide 16

Slide 16 text

Executar Executar é simples! Inserir input o tempo todo? Ótimo! Comparar saída no terminal? $ python a.py $ python a.py < a.in $ python a.py < a.in > a.out $ diff a.out a.ans

Slide 17

Slide 17 text

Executar Executar é simples! Inserir input o tempo todo? Ótimo! Comparar saída no terminal? $ python a.py $ python a.py < a.in $ python a.py < a.in > a.out $ diff a.out a.ans

Slide 18

Slide 18 text

Executar Executar é simples! Inserir input o tempo todo? Ótimo! Comparar saída no terminal? Usar ferramentas disponíveis $ python a.py $ python a.py < a.in $ python a.py < a.in > a.out $ diff a.out a.ans

Slide 19

Slide 19 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 20

Slide 20 text

https://www.urionlinejudge.com.br/judge/pt/problems/view/1001

Slide 21

Slide 21 text

https://www.urionlinejudge.com.br/judge/pt/problems/view/1892

Slide 22

Slide 22 text

Entendendo o problema 1) Como a entrada se transforma na saída? Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 23

Slide 23 text

Entendendo o problema 1) Como a entrada se transforma na saída? 2) Contar pares com alguma condição Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 24

Slide 24 text

Entendendo o problema 1) Como a entrada se transforma na saída? 2) Contar pares com alguma condição 3) Matrícula mais nova com melhor colocação Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 25

Slide 25 text

Entendendo o problema 1) Como a entrada se transforma na saída? 2) Contar pares com alguma condição 3) Matrícula mais nova com melhor colocação 4) Tentar encontrar os 5 pares Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 26

Slide 26 text

Entendendo o problema 1) Como a entrada se transforma na saída? 2) Contar pares com alguma condição 3) Matrícula mais nova com melhor colocação 4) Tentar encontrar os 5 pares a) 12 e 14: não b) 12 e 11: sim c) 12 e 10: sim d) 14 e 11: sim e) 14 e 10: sim f) 11 e 10: sim Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 27

Slide 27 text

Resolvendo o problema 1) Ler a entrada Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 28

Slide 28 text

Resolvendo o problema 1) Ler a entrada 2) Informações importantes da matrícula Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 29

Slide 29 text

Resolvendo o problema 1) Ler a entrada 2) Informações importantes da matrícula 3) Comparar cada um com os demais Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano?

Slide 30

Slide 30 text

Resolvendo o problema 1) Ler a entrada 2) Informações importantes da matrícula 3) Comparar cada um com os demais Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano? Ordenação

Slide 31

Slide 31 text

Resolvendo o problema 1) Ler a entrada 2) Informações importantes da matrícula 3) Comparar cada um com os demais Exemplo de Entrada Exemplo de Saída 4 12/0001111 14/0001111 11/0001111 10/0001111 5 contar quantos pares (i, j) existem tais que i < j e m[i] > m[j], onde 1 ≤ i,j ≤ N e m[i] m[i] significa a matrícula do aluno que ficou em i-ésimo lugar. As próximas N linhas são a classificação final dos alunos Calouro Vence Veterano? Ordenação contando as trocas

Slide 32

Slide 32 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 33

Slide 33 text

Ler entrada 3 tipos de entrada 1. Ler uma quantidade definida de casos 2. Ler até o fim do arquivo 3. Até receber um caracter específico

Slide 34

Slide 34 text

Ler quantidade definida https://www.urionlinejudge.com.br/judge/pt/problems/view/1892

Slide 35

Slide 35 text

Ler quantidade definida ler um inteiro N quantidade de alunos https://www.urionlinejudge.com.br/judge/pt/problems/view/1892

Slide 36

Slide 36 text

Ler quantidade definida ler um inteiro N quantidade de alunos https://www.urionlinejudge.com.br/judge/pt/problems/view/1892

Slide 37

Slide 37 text

Ler quantidade definida ler N vezes matrícula https://www.urionlinejudge.com.br/judge/pt/problems/view/1892

Slide 38

Slide 38 text

Ler quantidade definida ler N vezes matrícula https://www.urionlinejudge.com.br/judge/pt/problems/view/1892

Slide 39

Slide 39 text

Ler quantidade definida 1 if __name__ == "__main__": 2 n = int(input()) 3 4 for i in range(n): 5 a = input() 6 line = a.split() 7 print(line)

Slide 40

Slide 40 text

Ler quantidade definida 1 if __name__ == "__main__": 2 n = int(input()) 3 4 for i in range(n): 5 a = input() 6 line = a.split() 7 print(line) ler inteiro quantidade de casos

Slide 41

Slide 41 text

Ler quantidade definida 1 if __name__ == "__main__": 2 n = int(input()) 3 4 for i in range(n): 5 a = input() 6 line = a.split() 7 print(line) ler inteiro quantidade de casos ler n vezes informações

Slide 42

Slide 42 text

Ler entrada 3 tipos de entrada 1. Ler uma quantidade definida de casos 2. Ler até o fim do arquivo 3. Até receber um caracter específico

Slide 43

Slide 43 text

Ler até fim do arquivo

Slide 44

Slide 44 text

Ler até fim do arquivo https://www.urionlinejudge.com.br/judge/pt/problems/view/1197

Slide 45

Slide 45 text

Ler até fim do arquivo Critério de parada EOF https://www.urionlinejudge.com.br/judge/pt/problems/view/1197

Slide 46

Slide 46 text

Ler até fim do arquivo 1 import sys 2 if __name__ == "__main__": 3 for linha in sys.stdin: 4 v, t = linha.split() 5 print("v: {} -- t: {}".format(v, t))

Slide 47

Slide 47 text

Ler até fim do arquivo 1 import sys 2 if __name__ == "__main__": 3 for linha in sys.stdin: 4 v, t = linha.split() 5 print("v: {} -- t: {}".format(v, t)) importar para ler toda a entrada

Slide 48

Slide 48 text

Ler até fim do arquivo 1 import sys 2 if __name__ == "__main__": 3 for linha in sys.stdin: 4 v, t = linha.split() 5 print("v: {} -- t: {}".format(v, t)) importar para ler toda a entrada Passa por cada linha da entrada

Slide 49

Slide 49 text

Ler entrada 3 tipos de entrada 1. Ler uma quantidade definida de casos 2. Ler até o fim do arquivo 3. Até receber um caracter específico

Slide 50

Slide 50 text

Ler até caracter https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 51

Slide 51 text

Ler até caracter Informações a serem lidas para cada caso https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 52

Slide 52 text

Ler até caracter Informações a serem lidas para cada caso https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 53

Slide 53 text

Ler até caracter Informações a serem lidas para cada caso https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 54

Slide 54 text

Ler até caracter Informações a serem lidas para cada caso https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 55

Slide 55 text

Ler até caracter Caracter de parada https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 56

Slide 56 text

Ler até caracter Caracter de parada https://www.urionlinejudge.com.br/judge/pt/problems/view/1910

Slide 57

Slide 57 text

Ler até caracter 1 if __name__ == "__main__": 2 line = input() 3 o, d, k = line.split() 4 while line != "0 0 0": 5 channels = input() 6 print("saída correta") 7 line = input() 8 o, d, k = line.split() ler a primeira linha

Slide 58

Slide 58 text

Ler até caracter 1 if __name__ == "__main__": 2 line = input() 3 o, d, k = line.split() 4 while line != "0 0 0": 5 channels = input() 6 print("saída correta") 7 line = input() 8 o, d, k = line.split() ler a primeira linha a informação é processada caso a linha não seja "0 0 0"

Slide 59

Slide 59 text

Ler até caracter 1 if __name__ == "__main__": 2 line = input() 3 o, d, k = line.split() 4 while line != "0 0 0": 5 channels = input() 6 print("saída correta") 7 line = input() 8 o, d, k = line.split() ler a primeira linha a informação é processada caso a linha não seja "0 0 0" o resto do caso só é lido quando for pertinente

Slide 60

Slide 60 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 61

Slide 61 text

Análise de complexidade eficiência comparação unidades lógicas ordem de magnitude

Slide 62

Slide 62 text

operações O(1) busca em array O(n) busca em matriz O(n²) Análise de complexidade

Slide 63

Slide 63 text

entrada não afeta a quantidade de operações O(1) quantidade de elementos altera linearmente a quantidade O(n) quantidade de elementos altera quadraticamente a quantidade O(n²) Análise de complexidade

Slide 64

Slide 64 text

operações O(1) busca em array O(?) busca em matriz O(n²) ordenado Análise de complexidade

Slide 65

Slide 65 text

operações O(1) busca em array O(log n) busca em matriz O(n²) Busca mais eficiente ordenado Análise de complexidade

Slide 66

Slide 66 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 67

Slide 67 text

Tipos de erro WA resposta errada Algum dos casos de teste teve resposta diferente do esperado ● Comparar casos especificados ● Pensar em casos de borda ○ maior e menor número possível ○ números negativos ● Casos conhecidos ○ fóruns ○ exemplos ○ udebug

Slide 68

Slide 68 text

Tipos de erro Presentation erro de apresentação Erros de apresentação costumam ser diferenças em caracteres de espaço em branco ● tabs ● espaços ● quebras de linha

Slide 69

Slide 69 text

Tipos de erro TLE excedeu o tempo As questões têm limite de tempo para a execução de cada arquivo de entrada ● Loop infinito ● solução com alta complexidade (Big O) ○ tem algum algoritmo mais rápido? ○ tem estrutura de dados mais adequada? ○ tem algum passo que não precisa? ○ algo pode ser trocado por uma operação?

Slide 70

Slide 70 text

Tipos de erro Runtime erro em tempo de execução Enquanto a questão era executada com as entradas, ocorreu um erro ● operação inválida para o tipo da variável ● tentar acessar posição inexistente na lista

Slide 71

Slide 71 text

Habilidades 1) Sem desespero 2) Executar e comparar saída 3) Entender e resolver o problema na mão 4) Ler entrada 5) Análise de complexidade 6) Entender os tipos de erros 7) Identificar o tipo de problema

Slide 72

Slide 72 text

Conteúdos

Slide 73

Slide 73 text

Conteúdos https://www.urionlinejudge.com.br/judge/pt/categories

Slide 74

Slide 74 text

Estruturas e Bibliotecas ● Busca sequencial e Busca binária ● Ordenação ○ insertion sort (ordenação por inserção) ■ Complexidade O(n2) ○ merge sort ■ Complexidade O(log n) ○ Tim sort é o padrão do python ■ Complexidade O(n log n) Slides com busca e ordenação

Slide 75

Slide 75 text

Estruturas e Bibliotecas https://visualgo.net/en/sorting

Slide 76

Slide 76 text

Estruturas e Bibliotecas ● Filas ● Pilhas ● Fila de prioridade ● Hash Table (dict e set)

Slide 77

Slide 77 text

Estruturas e Bibliotecas https://visualgo.net/en/heap?slide=1

Slide 78

Slide 78 text

Conteúdos https://www.urionlinejudge.com.br/judge/pt/categories

Slide 79

Slide 79 text

Grafos ● Também é estrutura de dados (especial) ● Travessia entre as informações armazenadas ○ Profundidade ○ Largura ○ Dijkstra ● Caminhos mínimos ● Ciclos ● Resiliência Meus slides de grafos Material de grafos do Edson Playlist de aulas de grafos do Edson

Slide 80

Slide 80 text

Conteúdos

Slide 81

Slide 81 text

Paradigmas de solução ● Algoritmos gulosos ● Dividir para conquistar ● Programação dinâmica ○ Problema da Mochila (knapsack) ○ Problema do troco ○ Caixeiro viajante

Slide 82

Slide 82 text

Recursos

Slide 83

Slide 83 text

Repositórios Repositório da disciplina do Edson (melhor professor que tive na faculdade) Curso em vídeo de Introdução a programação competitiva do professor Edson Repositório de Introdução a programação competitiva do Matheus Repositório de conteúdo recomendado por empresas como google Meus slides de todas as disciplinas

Slide 84

Slide 84 text

Juízes eletrônicos URI UVA CodeForces LeetCode HackerRank

Slide 85

Slide 85 text

Competições International Collegiate Programming Contest Google Code Jam Facebook Hacker Cup

Slide 86

Slide 86 text

Livros Cracking the coding interview Competitive Programming Visualgo

Slide 87

Slide 87 text

Obrigada! PyBR por ser o melhor evento amigas maravilhosas que tenho prof Edson por ser inspiração até hoje [email protected] https://speakerdeck.com/brunamoreira/ brunanayara.github.io