Maratona de Programação

Você está argumentando sobre pequenas otimizações. Do meu lado, afirmo que elas pouco importam numa competição de análise e projeto de algoritmos.

Os juízes não olham o código-fonte. Se não houver diferenças entre a saída gerada pelo seu programa e a saída esperada, sua submissão é aceita, desde que seu programa rode dentro dos limites de tempo e memória estabelecidos. Memória nunca é problema para um programa bem projetado, independente da linguagem de programação utilizada. Se dá estouro de memória em Java, também dará no equivalente escrito em C ou C++.

Pela n-ésima vez, encorajo-lhe a submeter para um dos problemas indicados por mim, porque você entenderá melhor do que tratam os problemas da competição. Vários problemas de maratonas passadas também estão disponíveis no SPOJ, no endereço http://br.spoj.pl/problems/regionais

[quote=alankelon]Você está argumentando sobre pequenas otimizações. Do meu lado, afirmo que elas pouco importam numa competição de análise e projeto de algoritmos.

Os juízes não olham o código-fonte. Se não houver diferenças entre a saída gerada pelo seu programa e a saída esperada, sua submissão é aceita, desde que seu programa rode dentro dos limites de tempo e memória estabelecidos. Memória nunca é problema para um programa bem projetado, independente da linguagem de programação utilizada. Se dá estouro de memória em Java, também dará no equivalente escrito em C ou C++.

Pela n-ésima vez, encorajo-lhe a submeter para um dos problemas indicados por mim, porque você entenderá melhor do que tratam os problemas da competição. Vários problemas de maratonas passadas também estão disponíveis no SPOJ, no endereço http://br.spoj.pl/problems/regionais[/quote]

Eu já li e entendi como a competição funciona.

O jit não faz “pequenas otimizações”. Ele faz otimizações muito mais complexas do que nós seres humanos podemos fazer em um curto espaço de tempo. Se no final um assembly(que pode ser gerado pelo jit, um compilador c++ ou outro de linguagem c) vai ser avaliado, usar java para desenvolver é sim uma vantagem muito grande, e posso citar várias aqui:

Gerenciamento de memória automática:

  • Implica em melhores algoritmos de alocação de memória e coleta de lixo. Se for comparar com malloc em c, ou “new” na linguagem c++ é uma diferença de 10 tempos ou mais. Muita coisa mesmo.
  • A máquina virtual suporta apontadores compactados e implicity sharing. Todos os objetos são apontadores compartilhados o que dá um ótimo desempenho ao resultado final compilado.
  • É claro, o coletor de lixo te deixa isento de lembrar que você deve “desalocar” um objeto ou recurso quando terminar de usá-lo. Em c ou c++ você pode ter problemas com wild pointers(apontadores nulos ou que apontam para área de memória de outros programas). Não preciso citar que somente delete é mais lento e custoso do que todo um sistema de implicit sharing ;

O resultado final é muito diferente de um programa compilado estaticamente, porque um programa java vai rodar em um ambiente que está constantemente otimizando-o.

O único problema do java ao meu ver nessa competição é o consumo de memória, porque ao final todos os métodos são assinados como virtuais no executável. Isso faz a máquina virtual alocar tudo no heap, mas fora isso a vantagem de possuir essas ferramentas citadas ainda é muito grande em ralação a esse ítem citado.

Você pode não concordar comigo, mas eu gostaria de saber a sua opinião de “em qual caso c++ ou c seria uma opção melhor que java. Ainda em uma competição onde a implementação do código fonte não é avaliada como você citou”.




Você quer que eu responda DE NOVO que a linguagem de programação é completamente irrelevante pra Maratona de Programação?

Queria que você me provasse e parace de falar. :smiley:
Numa boa, claro…

Tenha acompanhado este tópico para obter mais informações sobre a maratona.

Acredito que o @alankelon está argumentando que na competição essas otimizações da linguagem não fazem diferença. Pois, o que importa é a otimização do algortimo. Por exemplo, uma equipe usando Bubble Sort para ordenação nunca obterá a mesma eficiência de uma equipe usando um algoritmo de ordenação por intercalação.

Já o @juliocbq está argumentando que o Java é uma linguagem mais simples de programar, pois o compilador já faz suas otimizações internas. Portanto, seria vantajoso para as equipes utilizarem o Java.

Com base nisso, pergunto: @alankelon, duas equipes que estão usando o mesmo algoritmo. No entanto, um escrito em C++ e outro escrito em Java. Terá alguma diferença de perfomance? Ou de uso de memória? E essa diferença é analisada pelo juiz? Ganha-se pontos extras por consumir menos memória? Ou usar menos tempo?
Por que a maioria das equipes preferem usar o C++ sendo que o Java tem uma linguagem mais simples (na minha opinião)?

[quote=RafaelViana]Tenha acompanhado este tópico para obter mais informações sobre a maratona.

Acredito que o @alankelon está argumentando que na competição essas otimizações da linguagem não fazem diferença. Pois, o que importa é a otimização do algortimo. Por exemplo, uma equipe usando Bubble Sort para ordenação nunca obterá a mesma eficiência de uma equipe usando um algoritmo de ordenação por intercalação.

Já o @juliocbq está argumentando que o Java é uma linguagem mais simples de programar, pois o compilador já faz suas otimizações internas. Portanto, seria vantajoso para as equipes utilizarem o Java.

Com base nisso, pergunto: @alankelon, duas equipes que estão usando o mesmo algoritmo. No entanto, um escrito em C++ e outro escrito em Java. Terá alguma diferença de perfomance? Ou de uso de memória? E essa diferença é analisada pelo juiz? Ganha-se pontos extras por consumir menos memória? Ou usar menos tempo?
Por que a maioria das equipes preferem usar o C++ sendo que o Java tem uma linguagem mais simples (na minha opinião)?[/quote]

Rafael, muito obrigado. Essa é uma dúvida que eu tenho. Imagino que deva existir um software que analiza os códigos fontes e não o assembly durante a postagem no servidor na competição. Se somente o assembly for analizado java seria uma ferramenta mais robusta que as demais devido aos itens que citei mais acima.

Me intrometendo e colocando os meus “achos” na discussão…

Não, o tempo e a memória não são analisados, desde que não sejam ultrapassados (ou seja, desde que o algoritmo não ultrapasse o tempo permitido e utilize a quantidade máxima permitida). Se a resposta for certa e o time que fez em Java enviou antes do time que fez em C++, quem sai na frente e o time que fez em Java.

Veja esse placar. Cada letra é um problema. Embaixo de cada bexiga tem x/y, onde x é a quantidade de vezes que o problema foi submetido e y é o tempo que levou para ser submetido e aceito. Quando você submete e erra, tem uma certa penalidade (o cálculo deve ter na página da maratona). Aqui tem alguns registros das regionais. Se você procurar direitinho, vai ver que tem o histórico de submissões.

Minha opinião? Hoje, é mais fama de lento do que qualquer outra coisa. Antes, era porque Java era, de fato, mais lento e demorava pra ler as entradas. Hoje acredito que esteja bem melhor. Vide essa solução do segundo colocado do Google Code Jam 2011 Qualif. Round.

[code]
import java.util.;
import static java.lang.Math.
;

public class A {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for(int zz = 1; zz <= T;zz++){
int N = in.nextInt();
int bat = 1;
int oat = 1;
int btime = 0;
int otime = 0;
for(int i = 0; i < N;i++){
if(in.next().equals(“B”)){
int next = in.nextInt();
btime = max(btime+abs(bat-next), otime)+1;
bat = next;
}else{
int next = in.nextInt();
otime = max(otime+abs(oat-next), btime)+1;
oat = next;
}
}
System.out.format(“Case #%d: %d\n”, zz, max(btime, otime));
}
}
}[/code]

[Editado]
Esqueci de colocar o placar e perdi o Ctrl V. De qualquer forma, vejam o placar de 2008, neste site: http://www.ime.usp.br/~cef/maratona.html

Pra tirar a dúvida mesmo, é só fazer um problema no spoj. Se ninguém fizer, eu faço Sábado e coloco a resposta aqui.

Isso era porque java não pussuía um jit e o bytecode lotava os registradores da máquina virtual. O jit hoje faz o trabalho por uns 3 programadores juntos. Por isso postei aquele programa que executa um fibonacci. Se você olhar e implementar em outras linguagens vai ver que é muito difícil bater o resultado final do jit. Por isso que acredito que java seja bem mais vantajosa que as demais linguagens.

E na sua opinião, em qual tipo de problema acha que c pode ser mais vantajoso que java?

[quote=RafaelViana]Tenha acompanhado este tópico para obter mais informações sobre a maratona.

Acredito que o @alankelon está argumentando que na competição essas otimizações da linguagem não fazem diferença. Pois, o que importa é a otimização do algortimo. Por exemplo, uma equipe usando Bubble Sort para ordenação nunca obterá a mesma eficiência de uma equipe usando um algoritmo de ordenação por intercalação.

Já o @juliocbq está argumentando que o Java é uma linguagem mais simples de programar, pois o compilador já faz suas otimizações internas. Portanto, seria vantajoso para as equipes utilizarem o Java.

Com base nisso, pergunto: @alankelon, duas equipes que estão usando o mesmo algoritmo. No entanto, um escrito em C++ e outro escrito em Java. Terá alguma diferença de perfomance? Ou de uso de memória? E essa diferença é analisada pelo juiz? Ganha-se pontos extras por consumir menos memória? Ou usar menos tempo?
Por que a maioria das equipes preferem usar o C++ sendo que o Java tem uma linguagem mais simples (na minha opinião)?[/quote]

A resposta é não para todas as perguntas do penúltimo parágrafo.

Preferem C e C++ por questão cultural apenas, porque, em geral, os times de uma instituição deixam código legado para os próximos times no notebook citado anteriormente. O legado mundial é predominantemente escrito em C e C++ e não há motivo de reescrever em Java.

Nesta competições, orientação a objetos não é fundamental. No máximo, usa-se estruturas de C. É muito comum o uso de arrays estáticos também.

Queria que você me provasse e parace de falar. :smiley:
[/quote]

Estude análise de algoritmos. Comece por aqui http://www.ime.usp.br/~pf/livrinho-AA/

Queria que você me provasse e parace de falar. :smiley:
[/quote]

Estude análise de algoritmos. Comece por aqui http://www.ime.usp.br/~pf/livrinho-AA/[/quote]

rs… eu conheço isso muito bem.

Este é um artigo meu publicado na usp.
http://www.usp.br/siicusp/Resumos/13Siicusp/index01.htm

A sua falta de argumentos é grande hein!?

Legal! Então fim de papo.

Boa tarde tem este exercício resolvido em C++?? se tiver poderia me enviar no e-mail ferreira.marcelo2012@yahoo.com.br.

Motivo: para fins academicos.
Obrigado.

Marcelo.

[quote=getAdicted]Opa,

Eu achei uns exercícios da maratona de 2007 perdidos aqui:

Maratona de Programação da SBC-ACM ICPC-2007 3

[color=black][size=18]Problema B

Rouba-Monte

Nome do arquivo fonte: rouba.c, rouba.cpp, rouba.java ou rouba.pas[/size][/color]

Um dos jogos de cartas mais divertidos para crianças pequenas, pela simplicidade, é Rouba-
Monte. O jogo utiliza um ou mais baralhos normais e tem regras muito simples. Cartas
são distinguidas apenas pelo valor (ás, dois, três, . . .), ou seja, os naipes das cartas não são
considerados (por exemplo, ás de paus e ás de ouro têm o mesmo valor).
Inicialmente as cartas são embaralhadas e colocadas em uma pilha na mesa de jogo, chamada
de pilha de compra, com face voltada para baixo. Durante o jogo, cada jogador mantém um
monte de cartas, com face voltada para cima; em um dado momento o monte de um jogador
pode conter zero ou mais cartas. No inécio do jogo, todos os montes dos jogadores têm zero
cartas. Ao lado da pilha de compras encontra-se uma área denomindada de área de descarte,
inicialmente vazia, e todas as cartas colocadas na área de descarte são colocadas lado a lado
com a face para cima (ou seja, não são empilhadas).
Os jogadores, dispostos em um círculo ao redor da mesa de jogo, jogam em sequência, em
sentido horário. As jogadas prosseguem da seguinte forma:

  • O jogador que tem a vez de jogar retira a carta de cima da pilha de compras e a mostra
    aos outros jogadores; vamos chamar essa carta de carta da vez.

  • Se a carta da vez for igual a alguma carta presente na área de descarte, o jogador retira
    essa carta da área de descarte colocando-a, juntamente com a carta da vez, no topo de
    seu monte, com as faces voltada para cima, e continua a jogada (ou seja, retira outra
    carta da pilha de compras e repete o processo).

  • Se a carta da vez for igual à carta de cima de um monte de um outro jogador, o jogador
    "rouba" esse monte, empilhando-o em seu próprio monte, coloca a carta da vez no topo
    do seu monte, face para cima, e continua a jogada.

  • Se a carta da vez for igual à carta no topo de seu próprio monte, o jogador coloca a carta
    da vez no topo de seu próprio monte, com a face para cima, e continua a jogada.

  • Se a carta da vez for diferente das cartas da área de descarte e das cartas nos topos dos
    montes, o jogador a coloca na área de descarte, face para cima, e a jogada se encerra
    (ou seja, o próximo jogador efetua a sua jogada). Note que esse é o único caso em que o
    jogador não continua a jogada.

O jogo termina quando não há mais cartas na pilha de compras. O jogador que tiver o
maior monte (o monte contendo o maior número de cartas) ganha o jogo. Se houver empate,
todos os jogadores com o monte contendo o maior número de cartas ganham o jogo.

[color=black][size=18]Entrada[/size][/color]

A entrada é composta de vários casos de teste. A primeira linha de um caso de teste contém dois
inteiros N e J, representando respectivamente o número de cartas no baralho (2 <= N <= 10.000)
é o número de jogadores (2 <= J <= 20 e J <= N). As cartas do baralho são representadas por
números inteiros de 1 a 13 e os jogadores são identificados por inteiros de 1 a J. O primeiro
jogador a jogar é o de número 1, seguido no jogador de número 2, . . ., seguido pelo jogador
de número J, seguido pelo jogador de número 1, seguido do jogador de número 2, e assim
por diante enquanto houver cartas na pilha de compras. A segunda linha de um caso de teste
contém N inteiros entre 1 e 13, separados por um espaço em branco, representando as cartas
na pilha de compras. As cartas são retiradas da pilha de compras na ordem em que aparecem
na entrada. O final da entrada é indicado por uma linha com N = J = 0.
A entrada deve ser lida da entrada padrão.

[color=black][size=18]Saida[/size][/color]

Para cada caso de teste seu programa deve imprimir uma linha, contendo o número de cartas
do monte do jogador ou jogadores que ganharam a partida, seguido de um espaço em branco,
seguido do(s) identificador(es) dos jogadores que ganharam a partida. Se há mais de um jogador
vencedor imprima os identificadores dos jogadores em ordem crescente, separados por um espa¸co
em branco.

[color=black][size=18]A saída deve ser escrita na saída padrão.[/size][/color]

Exemplo de entrada
4 2
10 7 2 5
6 3
1 2 1 2 1 2
8 2
3 3 1 1 2 3 4 5
0 0

Saída para o exemplo de entrada
0 1 2
5 1
3 2

O treinamento foi nos dado pelos [size=24][color=black]GRANDES[/color] [/size] mestres:

Ciro Cirne Trindade
Emmanuel K. Illunga

[]'s[/quote]

Já participei da maratona e, se você não tiver com os conhecimentos de algorítmos BEM consolidado, acaba não andando na prova.

Quando competimos, utilizamos linguagem C e numa das provas tivemos trabalho pois estávamos com o programa correto mas não era performático suficiente :expressionless: quando notamos o “problema”, não havia tempo hábil para acertar o código…

Apenas para sanar dúvidas quanto a uma competição que permite usar C ou Java (acho que C++ era permitida também), o programa passa por uma bateria de testes que deve ser diferenciado para cada linguagem e ganha quem resolver mais exercícios no menor tempo.

Um outro site interessante para a preparação é o USACO http://ace.delos.com/usacogate . Este é em inglês e tem um formato similar ao da maratona.

[quote=alankelon][quote=wellington.nogueira]

Apenas para sanar dúvidas quanto a uma competição que permite usar C ou Java (acho que C++ era permitida também), o programa passa por uma bateria de testes que deve ser diferenciado para cada linguagem e ganha quem resolver mais exercícios no menor tempo.

[/quote]

A informação está errada, porque o conjunto de testes é o mesmo, independente da linguagem de programação utilizada. [/quote]
Desculpe, me expressei mal. Realmente a massa de teste é a mesma, mas as condições podem ser diferentes (por exemplo, um programa escrito em C pode levar 0,1s e um em java pode levar 0,2). Apesar que, hoje em dia, devem estar em pé de igualdade.