introdução à programação competitiva · introdução à programação competitiva professor...

34
Introdução à programação competitiva Professor Tomás O. Junco Vázquez

Upload: others

Post on 18-Oct-2020

27 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Introdução à programação competitivaProfessor Tomás O. Junco Vázquez

Page 2: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

O que é IOI?

• Olimpiada Internacional de Informática.

• Competição anual de programação orientada aestudantes de Ensino Medio que pretende motivar ointeresse na Computação.

• A primeira competição IOI aconteció em Bulgaria, noano 1989 bajo el patrocinio da UNESCO.

• É uma das 5 olimpiadas internacionais de ciências.

Page 3: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

O que é IOI?

Principais metas:

• Difundir a Ciência da Computação e a Informática noEnsino Medio.

• Proporcionar um espaço onde os estudiantes eprofessores podem intercambiar culturas,experiências e conhecimentos.

• Contribuir na formação dos estudantescompartilhando experiências e conhecimentos.

• Site oficial: www.ioinformatics.org

Page 4: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

O que é IOI?

Desenvolve-se num ciclo de quatro etapas:

1. Treinamento.

2. Competições provinciais.

3. Competição nacional.

4. Competição mundial.

Page 5: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Motivações para participar

• Diversão, exercitar a mente e intercâmbio cultural.Programar é divertido.

• Aumenta o prestígio, visibilidade e o reconhecimentointernacional da instituição e do país.

• Participar e obter prémios nos distintos níveis dacompetição.

Page 6: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

• Em cada um dos dois dias de prova os competidoressão dados três problemas computacionais pararesolver em cinco horas.

• Se trabalha individualmente, com um computador esem ajuda externa.

• Os problemas são apresentados na língua materna.

• Os programas são testados automáticamente,sendo atribuídos pontos para o código docompetidor em função de cada caso de teste queemite a resposta certa no tempo esperado.

• Linguagens permitidas: C++, Pascal e Java.

Detalhes da competição

Page 7: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

• Para o ciclo 2017-2018 a idade máxima permitida para os participantes das competições é 20 anos no dia 1 de Julho de 2018.

• Mais detalhes em: https://ioiangola.wordpress.com/

Detalhes da competição

Page 8: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Júris on-line

São aplicativos web desenhados para meios

geralmente académicos, que incluem problemas

de diferentes matérias para ser resolvidos

mediante técnicas de programação e, o mais

importante, avaliam automaticamente as soluçõesdadas pelos usuarios.

Page 9: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Júris on-line para o treinamento

• http://coj.uci.cu/

• http://codeforces.com/

• http://www.usaco.org/

• https://www.codechef.com/

• https://a2oj.com/

• http://www.spoj.com/

• http://acm.timus.ru/

Page 10: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Exemplo de problema num júri on-line

A+B ProblemTime Limit: 1000MS Memory Limit: 10000K

Description

Calculate a+b

Input

Two integer a,b (0 <= a,b <= 10)

Output

Output a+b

Sample Input

1 2

Sample Output

3

Page 11: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Usuario dojúri on-line

Compilador Seleccionado

Componente de Execução

Componente de Julgado

SaídaEsperada

Dados de Prova

Descrição

Problema

Solução do usuario

Executável

Saída do usuario

Funcionamento dos júris on-line

Page 12: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Tipos de veredicto

• Judging (JDG)

• Runtime Error (RTE)

• Wrong Answer (WA)

• Compilation Error (CE)

• Invalid Function (IVF)

• Time Limit Exceeded (TLE)

• Accepted (AC)

Page 13: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Esquema geral de trabalho

Nosso programa• Algoritmos• Conhecimento de

múltiplas matérias• Técnicas de programação• Estruturas de dados• Memória• Tempo de execução

ENTRADA DOS DADOS

.in

SAÍDA DO PROGRAMA

.out

Sytem.out.println(“Entre o valor de a:”);

Sytem.out.println(“A soma é: ” + (a + b));

Page 14: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Esquema geral de trabalho

• Também não é preciso verificar as condições da secção Input.

• Em caso de múltiplas entradas, também não é preciso lertodas as entradas de uma vez. Podem ser processadas pouco apouco.

• Em Java não pode incluir a linha package <nome>;

if(a >= 0 && a <= 10 && b >= 0 && b <= 10){

}

Page 15: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

❖Classe ScannerScanner in = new Scanner(System.in);

int a = in.nextInt();

❖Classe BufferedReaderBufferedReader in = new BufferedReader(new InputStreamReader(System.in));

int a = Integer.valueOf(in.readLine());

A principal diferença entre estas duas formas de leitura é quanto atempo, com a classe Scanner a leitura é mais lenta.

Entrada dos datos (Java)

Page 16: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

import java.util.Scanner;

public class Main{

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

int a = in.nextInt();

long b = in.nextLong();

double c = in.nextDouble();

float d = in.nextFloat();

String cad1 = in.next();

String line = in.nextLine();

}

}

Entrada dos datos (Java)

Page 17: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Main{

public static void main(String[] args) throws IOException {

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

int a = Integer.valueOf(in.readLine());

long b = Long.parseLong(in.readLine());

double c = Double.parseDouble(in.readLine());

float d = Float.parseFloat(in.readLine());

String cad1 = in.readLine().split(" ")[0];

String line = in.readLine();

}

}

Entrada dos datos (Java)

Page 18: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

❖função scanf()int a;

scanf("%d", &a);

❖cinint a;

cin >> a;

A principal diferença entre estas duas formas de leitura é quanto atempo, com cin a leitura é mais lenta.

Entrada dos datos (C++)

Page 19: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <cstdio>

int main(){

int a;

long long b;

double c;

float d;

char cad1[100], line[200];

scanf("%d", &a);

scanf("%lld", &b);

scanf("%lf", &c);

scanf("%f", &d);

scanf("%s", cad1);

gets(line);

return 0;

}

Entrada dos datos (C++)

Page 20: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <cstdio>

int main(){

int a;

long long b;

double c;

float d;

char cad1[100], line[200];

scanf("%d%lld%lf%f%s", &a, &b, &c, &d, cad1);

gets(line);

return 0;

}

Entrada dos datos (C++)

Page 21: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <iostream>

using namespace std;

int main(){

int a;

long long b;

double c;

float d;

char cad1[100], line[200];

cin >> a >> b >> c >> d >> cad1;

cin.getline(line, 200);

return 0;

}

Entrada dos datos (C++)

Page 22: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

import java.util.Scanner;

public class Main{

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

while (in.hasNext()) {

String cad = in.next();

//do something

}

}

}

Leitura até fim de ficheiro (Java)

Page 23: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Main{

public static void main(String[] args) throws IOException {

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

while(in.ready()){

String cad = in.readLine();

//do something

}

}

}

Leitura até fim de ficheiro (Java)

Page 24: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <cstdio>

int main(){

int n;

while(scanf("%d", &n) != EOF){

//do something

}

return 0;

}

Leitura até fim de ficheiro (C++)

Page 25: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <iostream>

using namespace std;

int main(){

int n;

while(!cin.eof()){

cin >> n;

//do something

}

return 0;

}

Leitura até fim de ficheiro (C++)

Page 26: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

❖System.out.print("ACM-ICPC 2017");

System.out.println();

❖System.out.printf("%s %d\n", "ACM-ICPC", 2017);

❖PrintWriterPrintWriter out = new PrintWriter(new BufferedOutputStream(System.out, 1 << 16), false);

out.println("ACM-ICPC 2017");

out.flush(); out.close();

A principal diferença entre estas duas formas de saída é quanto atempo, com a classe PrintWriter a saída é mais rápida.

Saída (Java)

Page 27: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

import java.io.BufferedOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

public class Main{

public static void main(String[] args) throws IOException {

PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out, 1 << 16), false);

out.println("ACM-ICPC 2017");

out.flush();

out.close();

}

}

Saída (Java)

Page 28: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

❖função printf()int a;

printf("%d", a);

❖coutint a;

cout << a;

A principal diferença entre estas duas formas de saída é quanto atempo, com cout a saída é mais lenta.

Saída (C++)

Page 29: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <cstdio>

int main(){

int a; long long b;

double c; float d;

char cad1[100], line[200];

//ENTRADA DOS DADOS

printf("%d\n", a);

printf("%lld\n", b);

printf("%lf\n", c);

printf ("%f\n", d);

printf("%s\n", cad1);

puts(line);

return 0;

}

Saída (C++)

Page 30: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <cstdio>

int main(){

int a; long long b;

double c; float d;

char cad1[100], line[200];

//ENTRADA DOS DADOS

printf("%d\n%lld\n%lf\n%f\n%s\n", a, b, c, d, cad1);

puts(line);

return 0;

}

Saída (C++)

Page 31: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <iostream>

#include <cstring>

using namespace std;

int main(){

int a; long long b;

double c; float d;

char cad1[100], line[200];

//ENTRADA DOS DADOS

cout << a << endl << b << endl << c << endl << d << endl << cad1 << endl;

cout.write(line, strlen(line));

return 0;

}

Saída (C++)

Page 32: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintStream;

import java.util.Scanner;

public class Main{

public static void main(String[] args) throws IOException{

System.setIn(new FileInputStream("entrada.txt"));

System.setOut(new PrintStream(new FileOutputStream("saida.txt")));

Scanner in = new Scanner(System.in);

int a = in.nextInt();

int b = in.nextInt();

System.out.println(a + b);

}

}

Ler/Escrever desde/para um ficheiro em Java

Page 33: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

#include <cstdio>

int main(){

int a, b;

freopen("entrada.txt", "r", stdin);

freopen("saida.txt", "w", stdout);

scanf("%d%d", &a, &b);

printf("%d", a + b);

return 0;

}

Ler/Escrever desde/para um ficheiro em C++

Page 34: Introdução à programação competitiva · Introdução à programação competitiva Professor Tomás O. Junco Vázquez. O que é IOI? • Olimpiada Internacional de Informática

Introdução à programação competitivaProfessor Tomás O. Junco Vázquez