Disciplina: ACH2107 - Desafios de Programação I
1º Semestre de 2019

Aulas

As atividades semanais desta disciplina terão a seguinte dinâmica (apenas as atividades especiais e a recuperação possuem dinâmicas diferentes):
1ª parte de cada aula: Laboratório de SI número 5 - dicas sobre o problema anterior e apresentação do novo problema.
2ª parte de cada aula: Laboratório de SI número 5 - montagem inicial dos grupos e desenvolvimento da solução.

Submissão no ACM Online Judge

Para submeter problemas (por exemplo, no ACM Online Judge) é necessário estar cadastrado no site. A maioria dos sistemas tem algum tipo de restrição (por exemplo, para submissões em Java no sistema da ACM). Criamos um exemplo de código fonte em Java que pode ser usado como corpo para soluções de problemas que recebam números inteiros como entrada: [Main.java], note que o nome da classe tem que ser Main nesse sistema.

Além de submeter a solução no sistema acima, cada grupo deverá mostrar o resultado da submissão ao professor e enviar um e-mail ao docente (digiampietri@usp.br) durante a aula contendo:
  • Assunto: ACH2107 - Problema x - Turma w (onde x é o número do problema sendo resolvido naquela aula) e w é a turma do grupo (04);
  • Corpo do e-mail:: Número do grupo (atribuído a cada aula); número USP e nome de todos os integrantes do grupo
  • Anexo: os arquivos Main.java (ou .c, ou .cpp, etc) que foram aceitos no sistema.
Este e-mail serve de confirmação de presença (além da lista), por isso, sua equipe deve enviá-lo mesmo que não tenha conseguido resolver o problema.

Teste sua solução antes de submetê-la. É importante que a classe principal chame-se Main e que ela não pertença a nenhum pacote. Para isso, execute seu programa (no console/terminal do Linux ou Prompt do MS-DOS) da seguinte maneira: java Main < entrada.txt [.bat], onde Main é o nome da classe principal de tua solução (por exemplo, arquivo Main.java, classe Main) e entrada.txt é o arquivo de entrada para o problema que você está tentando resolver (e pode ser encontrado aqui no site). A saída dever ser idêntica a saída esperada (que pode ser encontrada nos arquivos saida.txt).
Durante as Atividades Especiais será usado o sistema de submissão online a critério od professor e de acordo com os problemas que forem escolhidos.

Problemas

IDProblemaEnunciado em
Português
EntradasSaídasAproveitamento
do Problema
Complexidade Assintótica
Simplista // Solução_Submetida
Discussão/Dicas
100 [UVa]O problema do 3*n + 1
[pdf]
entrada.txt
entrada2.txt
saida.txt
saida2.txt
73,0%
DesconhecidaDesconhecida Cuidado com o caso em que o primeiro número da entrada for maior que o segundo. Se desejar use o arquivo Main.java ou Main.c ou Main.py para implementar sua solução. Veja aqui o material adicional
1001 [URI]Extremamente Básico
[html]
A entrada é composta por apenas um par de números inteiros. Se desejar, use o arquivo Main.java para implementar sua solução.
639Colocando Torres de Xadrez
[pdf]
entrada.txt saida.txt
90,9%
O(2^n)O(2^n) Complete o arquivo Main.java. O problema pode ser resolvido com uma tentativa e erro onde em cada casa pode-se colocar ou não uma torre de xadrez.
146Códigos de Identificação
[pdf]
entrada.txt
entrada2.txt
saida.txt
saida2.txt
90,6%
O(n^2)O(n), O(n*log(n)) e O(n^2) Arquivo Main.java para a leitura do arquivo de entrada (implemente o método executar para resolver este problema). Dica: divida o problema em três partes: (i) identificar o ponto onde a sequência será mudada; (ii) identificar qual valor irá para esse lugar; (iii) ordenar de maneira crescente o resto da sequência (após o ponto de mudança).
352Guerras Sazonais
[pdf]
entrada.txt saida.txt
91,4%
O(n^3)O(n^2) Arquivo Main.java para a leitura do arquivo de entrada (implemente o método executar para resolver este problema). Dica: para cada caça identificado, apague-o totalmente da imagem.
580Massa Crítica
[pdf]
entrada.txt saida.txt
91,2%
O(n!) ou O(2^n)O(n) Complete o arquivo Main.java. Use long para armazenar a resposta (o tipo int pode ser pequeno demais). Para otimizar o sistema basta usar um arranjo "global/estático" com os valores parciais já calculados.
337Interpretando Sequências de Controle
[pdf]
entrada.txt saida.txt
91,0%
O(n)O(n) Arquivo Main.java para a leitura do arquivo de entrada (implemente o método executar para resolver este problema). O algoritmo é ad hoc, basta manter o terminal atualizado e executar os comandos solicitados.
151Crise Elétrica
[pdf]
entrada.txt
entrada2.txt
saida.txt
saida2.txt
91,6%
O(n^6)O(n^3) Arquivo Main.java para a leitura do arquivo de entrada (implemente o método executar para resolver este problema).
Dica1: não é necessário utilizar um arranjo. As informações relevantes são: quantas cidades estão acesas antes da cidade 13; o total de cidades e a posição da última cidade apagada.
Minimaratona 1
1112Os Ratos e o Labirinto
[pdf]
entrada.txt saida.txt
90,5%
O(n^3)O(n^3),O(n^2) Arquivo Main.java para a leitura do arquivo de entrada (implemente o método executar para resolver este problema).
Dica: trata-se de um problema da distância mínima (caminho mínimo) de um ponto para todos os demais.
167Os Sucessores do Sultão
[pdf]
entrada.txt saida.txt
86,39%
O(k*((m^(m+1))) = O(134.217.728*k)O(744*k) Arquivo Main.java para a leitura do arquivo de entrada (implemente o método executar para resolver este problema). Trata-se de um problema de tentativa e erro, mas é importante otimizá-lo para não executar operações desnecessárias. Por exemplo, nunca é possível colocar duas rainhas numa mesma linha ou coluna (a cada chamada recursiva do algoritmo, você pode, por exemplo, ir para a próxima coluna).
442442 - Multiplicacao de Matrizes
[pdf]
entrada1.txt saida1.txt
93%
O(n^2)
O(n)
Complete o arquivo Main.java. Dicas: verifique como armazenar as matrizes da melhor forma para fazer os cálculos, bem como o que fazer com as matrizes resultantes.
Minimaratona 2
882882 - O Problema do Fabricante de Caixas Postais
[pdf]
entrada1.txt saida1.txt
93,44%
O(m^m)
O(k*m^3)
Complete o arquivo Main.java. Dica: não há uma fórmula mágica para resolver o problema, isto é, é necessário testar diferentes situações e verificar qual necessitará de mais bombinhas. Duas maneiras pensar na solução: decomposição do problema em problemas menores ou composição da solução a partir dos problemas menores.
439439 - Movimentos do Cavalo
[pdf]
entrada1.txt saida1.txt
93%
O(8^63)
O(8^6),O(8*8*8)
Complete o arquivo Main.java. Trata-se de um problema típico de busca em largura. Porém, pode ser utilizado um algoritmo Tentativa e erro clássico, para isso vocês provavelmente precisão usar variáveis/atributos globais e deverão limitar a profundidade da busca.
Minimaratona 3
377Matemática das Vacas
[pdf]
entrada.txt saida.txt
86,57%
O(n)O(n) Complete o arquivo Main.java. Dica: assim como existe a matemática binária e decimal, pode existir uma matemática quaternária. Que tal converter o "vacanes" para essa matemática base 4?

Linguagens de programação aceitas na disciplina: as mesmas dos sistemas de submissão

No caso do sistema UVa:
  • ANSI C 5.3.0 - GNU C Compiler with options: -lm -lcrypt -O2 -pipe -ansi -DONLINE_JUDGE
  • JAVA 1.8.0 - OpenJDK Java
  • C++ 5.3.0 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE
  • PASCAL 3.0.0 - Free Pascal Compiler
  • C++11 5.3.0 - GNU C++ Compiler with options: -lm -lcrypt -O2 -std=c++11 -pipe -DONLINE_JUDGE
  • PYTH3 3.5.1 - Python 3

    Links Interessantes / Referências

  • Sistema URI: URI Online Judge
  • Sistema UVa: UVa Online Judge (Universidade de Valladolid)
  • Banco de Problemas UVa: ACM UVa Problem Set (Universidade de Valladolid)
  • Submissão de Problemas UVa [você precisa estar autenticado no sistema] ACM Online Judge
  • Maratona de Programação - saiba como se inscrever e conheça o material de apoio
  • SPOJ - Sphere Online Judge
  • SPOJ Brasil
  • Google Code Jam
  • Top Coder
  • Microsoft Imagine Cup