Introdução à programação competitiva · Introdução à programação competitiva Professor...
Transcript of Introdução à programação competitiva · Introdução à programação competitiva Professor...
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