• Nenhum resultado encontrado

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
47
0
0

Texto

(1)

Introdução à programação competitiva

(2)

O que é ACM-ICPC?

• Concurso Internacional Universitário de

Programação, organizado pela ACM.

• Competição anual de programação de computadores entre equipas que representan as instituições de Ensino Superior.

• Surgiu nos Estados Unidos em 1970.

• Patrocinadores do evento: Apple (1989), AT&T (1990-1993), Microsoft (1994-1997), IBM (1998-).

(3)
(4)

O que é ACM-ICPC?

Principais metas:

• Incentivar o desenvolvimento e reconhecimento de habilidades profissionais.

• Proporcionar um espaço onde os estudiantes e

professores podem intercambiar culturas,

experiências e conhecimentos.

• Garantir uma plataforma para orientar e incentivar a atenção da indústria, academia e o público que possa olhar as próximas gerações de profissionais da Informática.

(5)

O que é ACM-ICPC?

O ACM-ICPC é um dos eventos académicos mais antigos e grandes em termos de participação e prestígio a nível do mundo.

(6)

O que é ACM-ICPC?

Níveis de competição em cada ciclo:

1. Concursos Locais. A nível de instituições. 2. Concursos Nacionais. A nível de país.

3. Concursos Regionais. Realizam-se a entre Outubro

e Dezembro de cada ano.

4. Final Mundial. Realizar-se a no primeiro semestre

(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)

Habilidades ACM-ICPC

• Resolução de problemas. • Disciplina. • Lógica e gênio. • Matemáticas. • Linguagens de programação. • Idioma Inglês. • Trabalho em equipa.

(16)

Habilidades Profissionais

• Resolução de problemas. • Disciplina. • Lógica e gênio. • Matemáticas. • Linguagens de programação. • Idioma Inglês. • Trabalho em equipa.

(17)

Motivações para participar

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

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

• Participar e obter prémios nos distintos níveis da competição de programação mais antiga e prestigiosa do mundo.

(18)

Motivações para participar

• Melhorar habilidades em programação e algoritmos eficientes na resolução de problemas, com idioma inglês, matemática e trabalho em equipa.

• Intercambiar experiências e conhecimentos com pessoas de outras regiões do mundo.

• Obter 1 ano de membro grátis na ACM (acesso a vários recursos e materiais de alto valor científico, etc.).

(19)

Motivações para participar

• Muitas empresas no ramo tecnológico estão

observando os resultados do evento e dos

participantes em geral.

• Muitos dos participantes, vencedores ou não, recebem ofertas laborais das empresas; e podem exibir em seu currículo vital a participação no evento como um resultado.

(20)

• 6 até 12 problemas redigidos em idioma Inglês e de variadas complexidades.

• Correção automática das soluções. Enfoque de "Tudo ou Nada" em cada intento de solução.

• Qualificação por quantidade de problemas resolvidos e tempo total acumulado (inclui penalização pelo cada envio não certo).

• Duração: 4 a 5 horas. Linguagens: C, C++, Java, Python.

(21)

• Cada equipa está integrada com três estudantes e

um treinador da mesma universidade.

• Para o ciclo 2018-2019 cada estudante debe ter

nascido depois de 1995, ou ter iniciado o Ensino Superior depois de 2014.

• A composição das equipas é invariavel do principio ao fim.

• Cada equipa dispõe de um computador com sistema GNU/Linux y outras ferramentas livres.

• Podem trazer a competição bibliografías não digital.

(22)

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ções dadas pelos usuarios.

(23)

Júris on-line para o treinamento

• http://coj.uci.cu/ • http://codeforces.com/ • http://www.spoj.com/ • http://acm.timus.ru/ • http://acm.sgu.ru/ • https://www.codechef.com/

(24)

Exemplo de problema de um júri on-line

A+B Problem

Time 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

(25)

Usuario do júri on-line Compilador Seleccionado Componente de Execução Componente de Julgado Saída Esperada Dados de Prova Descrição Problema Solução do usuario Executável Saída do usuario

(26)

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

(27)

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 ler todas as entradas de uma vez. Podem ser processadas pouco a pouco.

• Em Java não pode incluir a linha package <nome>; if(a >= 0 && a <= 10 && b >= 0 && b <= 10){

(28)

Classe Scanner

Scanner in = new Scanner(System.in);

int a = in.nextInt();

Classe BufferedReader

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

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

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

(29)

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

}

(30)

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

} }

(31)

função scanf()

int a;

scanf("%d", &a);

cin

int a;

cin >> a;

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

(32)

#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; }

(33)

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

}

(34)

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

}

(35)

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

} } }

(36)

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

} } }

(37)

#include <cstdio>

int main(){ int n;

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

//do something

}

return 0;

}

(38)

#include <iostream> using namespace std; int main(){ int n; while(!cin.eof()){ cin >> n; //do something } return 0; }

(39)

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

System.out.println();

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

PrintWriter 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 a tempo, com a classe PrintWriter a saída é mais rápida.

(40)

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)

(41)

função printf() int a; printf("%d", a); ❖cout int a; cout << a;

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

(42)

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

(43)

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

}

(44)

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

}

(45)

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

}

(46)

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

}

(47)

Introdução à programação competitiva

Referências

Documentos relacionados

O principal a saber sobre o código 3: os blocos precedentes por def são como as funções são declaradas no Python. Entretanto, o código em cada bloco de função não é executado

O bloco do ciclo for é definido pela indentação I i.e., número de espaços à esquerda da linha.!. Please come to

Outras funções podem ter acesso a variáveis locais de uma determinada função quando recebem como argumento o valor ou o endereço destas variáveis (com o endereço, é

computador não entende qualquer instrução Ele entende apenas um conjunto fixo de instruções Essas instruções precisam ser usadas para resolver qualquer problema... Algoritmo

[r]

Caso discordem, por favor deixem as vossas questões para o período de dúvidas, que não será gravado.... Funções com listas

Campus: Rudge Ramos Data: 11.11.2015 Horário: 7h30 às 9h10 Local: L-328(MM60).. Coordenador/a de Sessão:

Permitem inspecionar linha por linha do programa Permitem inspecionar linha por linha do programa Outra forma, freqüentemente utilizada, é comentar partes do código para