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

Post on 18-Oct-2020

28 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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.

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

O que é IOI?

Desenvolve-se num ciclo de quatro etapas:

1. Treinamento.

2. Competições provinciais.

3. Competição nacional.

4. Competição mundial.

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.

• 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

• 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

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.

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/

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

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

Tipos de veredicto

• Judging (JDG)

• Runtime Error (RTE)

• Wrong Answer (WA)

• Compilation Error (CE)

• Invalid Function (IVF)

• Time Limit Exceeded (TLE)

• Accepted (AC)

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

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

}

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

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)

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)

❖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++)

#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++)

#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++)

#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++)

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)

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)

#include <cstdio>

int main(){

int n;

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

//do something

}

return 0;

}

Leitura até fim de ficheiro (C++)

#include <iostream>

using namespace std;

int main(){

int n;

while(!cin.eof()){

cin >> n;

//do something

}

return 0;

}

Leitura até fim de ficheiro (C++)

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

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)

❖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++)

#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++)

#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++)

#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++)

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

#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++

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

top related