Maratona de Programação

95 respostas
M

O que é?

Quem compete?

Um time representa uma instituição de ensino. Para efetuar a inscrição o time deverá ter um representante da instituição a que os alunos pertencem, e a instituição deverá se cadastar como uma sede da primeira fase da Maratona até 30 de abril.

PS: Cada instituição pode inscrever vários times.

A primeira fase será 17 de setembro de 2011, será uma fase eliminatoria.
A final brasileira será dias 4 e 5 de novembro de 2011

Será um grande evento e muito interessante que aqueles que tenham oportunidade participem, além de adquirir conhecimentos e um ótimo lugar para networks.

Segue o site da competição:
http://maratona.ime.usp.br/

95 Respostas

J

Olha, você citou uma questão muito interessante. Vou fazer algumas perguntas:

Quais linguagens estão disponíveis para uso na maratona?

Se c e java estão inclusas, mais uma pergunta:

É justo alguém usar um framework como o da linguagem java contra uma linguagem de médio nível como c, onde não se tem nem mesmo uma classe que encapsula uma string?

Já vi programador usando linguagem c que consegue resolver problemas muito mais complexos que outros usando linguagens de alto nível. Mas ainda existe uma diferença com relação a recursos utilizados(classes, objetos, enfim um framework todo).

Qual é a metodologia para se avaliar um programador c vs um java?

M

Ou seja, sem frameworks.

A

A questão por escolher Java ou C quando participávamos na maioria das vezes se encaixava em um dos critérios: se a necessidade fosse por velocidade era C ou se fosse por estruturas de dados complexas, era Java. O C++ seria mais ou menos um meio termo entre as duas.

[]'s

G

Beleza?

O meu professor era coordenador das olimpiadas de Santos, o pessoal da minha faculdade se arriscou mas acabou dando ITA pela centésima vez.

[]'s

A

Além do empenho dos alunos também é preciso apoio da faculdade. Na que me formei nem o projeto existe mais, tudo por falta de apoio. Quem saiba convença meus alunos a participar dessa :smiley:

P

sempre participei e indico fortemente. consolidei muita coisa de estruturas, grafos e algoritmos durante as provas. e meu irmao, que foi mais longe, participou dos mundiais no Canada e no Japao… aí sim! :slight_smile:

A

Legal :smiley:

L

Sem contar que é mt bem visto pelas empresas. Nem precisa ir pra final e tal, só de participar já conta bastante
Eu tb participei de algumas e recomendo, além de ser super divertido, vc aprende mt.

A

Oi,

Realmente é uma ótima oportunidade e muito bem visto, como já foi dito. Porém tem algumas regras que devem ser respeitadas, quando vi o tópico lembrei que quando quis participar não pude, ja tinha passado da idade rsrs… :stuck_out_tongue:

Um time é elegível se todos os seus membros satisfizerem a condição abaixo:

cada competidor, antes desta competição, pode ter participado de no máximo uma final mundial do concurso da ACM, de no máximo 4 (quatro) regionais sul-americanas do concurso (ou seja, da Maratona de Programação) e deve ter iniciado seus estudos universitários no ano de 2007 ou anos posteriores (a contar do início do primeiro curso universitário do aluno), ou ter nascido em 1988 ou anos posteriores.

Assim, por exemplo, se você iniciou seu primeiro curso superior em 2007, pode participar, mesmo que tenha nascido em 1980. Outro exemplo, se você nasceu em 1988 é pode participar, mesmo tendo iniciado sua graduação em 2004.

Apresentamos abaixo novamente as regras, agora em forma de um “programa” para verificar se o competidor é ou não elegível:

[regras de participação]
se
o competidor já participou de duas finais mundiais, ele não é elegível

se
o competidor já participou de cinco regionais, ele não é elegível

[período de elegibilidade]
se o competidor iniciou seus estudos universitários no ano 2006 ou anos anteriores E o competidor nasceu em 1987 ou anos anteriores), ele não é elegível;

caso contrário, o competidor é elegível.
R

Como assim havia passado da idade? Você pode ter nascido em qualquer ano, desde que tenha iniciado o curso há pouco tempo. E não tenha feito outro curso superior.

J

Recomendo o br.spoj.pl para se preparar. Participar da maratona vale muito a pena. ++

A

RafaelViana:
Anime:

Assim, por exemplo, se você iniciou seu primeiro curso superior em 2007, pode participar, mesmo que tenha nascido em 1980. Outro exemplo, se você nasceu em 1988 é pode participar, mesmo tendo iniciado sua graduação em 2004.

Como assim havia passado da idade? Você pode ter nascido em qualquer ano, desde que tenha iniciado o curso há pouco tempo. E não tenha feito outro curso superior.

se o competidor iniciou seus estudos universitários no ano 2006 ou anos anteriores E o competidor nasceu em 1987 ou anos anteriores), ele não é elegível;

Na verdade não sei se é a mesma maratona,por que era para universitários e estudantes de cursos técnicos, mas quem tinha nascido antes de 1987, não poderia participar…

A

Anime:

[período de elegibilidade]
se o competidor iniciou seus estudos universitários no ano 2006 ou anos anteriores E o competidor nasceu em 1987 ou anos anteriores), ele não é elegível;

caso contrário, o competidor é elegível. </blockquote>

Não sou elegível… =/

A

asaudate:
Anime:

[período de elegibilidade]
se o competidor iniciou seus estudos universitários no ano 2006 ou anos anteriores E o competidor nasceu em 1987 ou anos anteriores), ele não é elegível;

caso contrário, o competidor é elegível. </blockquote>

Não sou elegível… =/

Ahh… Que pena… :stuck_out_tongue:

J

Marky.Vasconcelos:
Formato do concurso:

Na final brasileira os programas deverão ser feitos em C, C++ ou Java.

Entretanto, não poderão fazer uso de material armazenado em meio magnético ou ter acesso à Internet durante a competição.

Ou seja, sem frameworks.

Opa, não digo isso. Java já tem todo o seu encapsulado nas suas classes. Como c é uma linguagem de médio nível não possui as facilidades do java.

J

Adelar:
A questão por escolher Java ou C quando participávamos na maioria das vezes se encaixava em um dos critérios: se a necessidade fosse por velocidade era C ou se fosse por estruturas de dados complexas, era Java. O C++ seria mais ou menos um meio termo entre as duas.

[]'s


C++ tem o mesmo nível da Java.

Mesmo assim não é tão justo não. O hotspot tem o jit para otimizar o código. Ou seja, pode ser 3 programadores x 1 programador se contar desempenho. Não estou criticando o evento não, é que sempre tive curiosidade de entender por que a competição não usa linguagens do mesmo nível. Ex:

C++ vs Java;

Java vs C#;

Java vs ObjectPascal;

python x ruby;

Digo isso porque já participei de algumas (á alguns bons anos) e ninguém da coordenação conseguiu me explicar isso.

J

wellington.nogueira:
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.

Então, isso faz mais sentido. Não pode ser usada como métrica somente a solução do problema, mas sim como ele foi resolvido. Dessa forma a competição toma outra característica.

O

Eu vou participar esse ano.

Fiquei feliz pra caramba por ter recebido o convite do coordenador do curso para integrar a equipe da Faculdade. Pra mim, que estou terminando o curso agora no meio do ano, vai ser uma experiência interessante.

Alguém aí que já tenha participado tem alguma dica sobre o que estudar, ou pode contar um pouco sobre a experiência?

K

Jovem,

Gostaria de saber o motivo pelo qual você publicou está noticia como fosse sua. Sendo que eu enviei a mesma ontem e estava aguardando a aprovação da moderação.
Isso não me afeta mas um tanto inseguro e desonesto, acredito nas regras do foruns e que deve servir para todos.

“Dê credito a quem é de crédito”
[color=red]
ISSO É PIOR DO QUE CENSURA É PLÁGIO.[/color][size=24] [/size]

sem mais

A

Isso é normal de acontecer. Os moderadores geralmente colocam quem mais postou a notícia. Podem ter equecido agora.

Quem quiser ir nessa maratona e tá em dúvida, eu digo: pegue o Algorithms do Cormen, um guia de C++ e vá sem pensar 2x. Não só na ICPC, mas na OBI, Spoj, TopCoder, Google Code Jam.

Essa coisa de idade não tem muito a ver. É uma condição OU outra. Um colega participou em meu time e ele tem 28 (isso a uns 2 anos).

K

Andre Brito:
Isso é normal de acontecer. Os moderadores geralmente colocam quem mais postou a notícia.

Quem quiser ir nessa maratona e tá em dúvida, eu digo: pegue o Algorithms do Cormen, um guia de C++ e vá sem pensar 2x. Não só na ICPC, mas na OBI, Spoj, TopCoder, Google Code Jam.

Jovem,
Para mim isto não tem problema nenhum o meu intuito foi disseminar a informação e que a galera participe do evento que é muito bacana e isto foi feito. Só não concordo em publicar as minhas palavras como se fosse a dele.

Abs,

A

Kanin Dragon:
Andre Brito:
Isso é normal de acontecer. Os moderadores geralmente colocam quem mais postou a notícia.

Quem quiser ir nessa maratona e tá em dúvida, eu digo: pegue o Algorithms do Cormen, um guia de C++ e vá sem pensar 2x. Não só na ICPC, mas na OBI, Spoj, TopCoder, Google Code Jam.

Jovem,
Para mim isto não tem problema nenhum o meu intuito foi disseminar a informação e que a galera participe do evento que é muito bacana e isto foi feito. Só não concordo em publicar as minhas palavras como se fosse a dele.

Abs,


A sim, mas acho que foi só um mau entendido… Ou não sei também né. Não quis tirar a sua razão, ainda mais sem saber o que você tinha escrito.

A

Andre Brito:

Essa coisa de idade não tem muito a ver. É uma condição OU outra. Um colega participou em meu time e ele tem 28 (isso a uns 2 anos).

Como assim, não tem nada a ver, são regras e se não se encaixar não da mesmo…

L

Olá

Kanin Dragon:

Jovem,

Gostaria de saber o motivo pelo qual você publicou está noticia como fosse sua. Sendo que eu enviei a mesma ontem e estava aguardando a aprovação da moderação.
Isso não me afeta mas um tanto inseguro e desonesto, acredito nas regras do foruns e que deve servir para todos.

“Dê credito a quem é de crédito”
[color=red]
ISSO É PIOR DO QUE CENSURA É PLÁGIO.[/color][size=24] [/size]

sem mais

Simples de explicar:

  1. O texto da sua notícia estava péssimo, infantil e pouco informativo.

  2. Continha um trecho de auto elogio que seria extremamente prejudicial a sua imagem e para preservá-lo, foi retirada qualquer referência a sua pessoa.

[]s
Luca

K

Jovem,

Qual o problema em dizer que vai disputar uma competição com intuito de ser o vencedor ?

Não vejo problema algum, apenas fazendo uma analogia ao esporte, nenhum atleta por mais limitado que seja entra em uma competição para perder e creio que todos do forum devem seguir este raciocinio.

Se os moderadores concordam ou não com o que escrevi não vejo problema nenhum. Aliais vocês tem um papel fundamental para manter a ordem e a qualidade do forum. Não concordo com a atitude exercicida por tais, creio que deveria ter sido notificado por MP antes de publicarem o tópico.

Abs,

M

Kanin Dragon:

Jovem,

Gostaria de saber o motivo pelo qual você publicou está noticia como fosse sua. Sendo que eu enviei a mesma ontem e estava aguardando a aprovação da moderação.
Isso não me afeta mas um tanto inseguro e desonesto, acredito nas regras do foruns e que deve servir para todos.

“Dê credito a quem é de crédito”
[color=red]
ISSO É PIOR DO QUE CENSURA É PLÁGIO.[/color][size=24] [/size]

sem mais

Pelos fatos que o Luca apontou.

Foi um consenso da moderação reformular a noticia e posta-la, mas desculpe, realmente esqueci de mencionar que voce colocou uma noticia sobre o assunto para aprovação.

Problema nenhum, mas as noticias do GUJ não devem ter carater pessoal, leitores de fora da comunidade querem saber sobre a Maratona de Programação, não sobre seu intuito de ganha-la.

Mesmo por que qualquer participante só entra em uma competição se for para ganhar não acha?

@topic
Eu sou elegivel para participar e ainda estou na faculdade, só falta um time para isso. =/

J

Marky.Vasconcelos:

@topic
Eu sou elegivel para participar e ainda estou na faculdade, só falta um time para isso. =/

Eu encararia uma olimpíada dessas mas já passei de ser elegível faz tem rsrsrsrs… Chegar lá com uns algoritmos de busca inteligentes na ponta do dedo te dá uma grande chance de boa pontuação.

K

Marky.Vasconcelos:
Kanin Dragon:

Jovem,

Gostaria de saber o motivo pelo qual você publicou está noticia como fosse sua. Sendo que eu enviei a mesma ontem e estava aguardando a aprovação da moderação.
Isso não me afeta mas um tanto inseguro e desonesto, acredito nas regras do foruns e que deve servir para todos.

“Dê credito a quem é de crédito”
[color=red]
ISSO É PIOR DO QUE CENSURA É PLÁGIO.[/color][size=24] [/size]

sem mais

Pelos fatos que o Luca apontou.

Foi um consenso da moderação reformular a noticia e posta-la, mas desculpe, realmente esqueci de mencionar que voce colocou uma noticia sobre o assunto para aprovação.

Problema nenhum, mas as noticias do GUJ não devem ter carater pessoal, leitores de fora da comunidade querem saber sobre a Maratona de Programação, não sobre seu intuito de ganha-la.

Mesmo por que qualquer participante só entra em uma competição se for para ganhar não acha?

@topic
Eu sou elegivel para participar e ainda estou na faculdade, só falta um time para isso. =/

Jovem,
Marky não vejo problema nenhum de vocês editarem ou recusarem os posts este é o papel do moderador como já citei anteriormente a importância do mesmo.
Só não concordei com a falta da notificação por MP com os motivos da não publicação do post.

Torço para você entrar em um time e seria bacana encontrar amigos do GUJ na competição.

abs,

A

Anime:
Andre Brito:

Essa coisa de idade não tem muito a ver. É uma condição OU outra. Um colega participou em meu time e ele tem 28 (isso a uns 2 anos).

Como assim, não tem nada a ver, são regras e se não se encaixar não da mesmo…


Como eu falei, é uma condição OU outra. Entrei em 2006 e participei em 2008 (sou de 1988 ). No meu time tinha mais um colega de 1983. Na época ele tava com 26 anos e pode participar de forma tranquila.

[Editado]
Pra quem tá pensando em ir e quer dar uma treinada, aí vão algumas dicas.

Sites com problemas de computação:

  • SPOJ (o brasileiro e o polonês): usa o sistema igual ao da maratona ACM ICPC (inclusive com problemas de maratonas). Outro fator interessante é que dá pra usar outras linguagens;
  • UVa: idem acima, mas acredito ter mais problemas;
  • Google Code Jam: todas as edições possuem moldes parecidos com o da maratona, mas não é necessário submeter o código, e sim pegar as entradas e colocar as saídas;
  • TopCoder: meu preferido. É um pouco diferente da maratona porque te dá um ambiente pra codar já. É só fazer um método com o retorno e mandar ver. Dá pra ver e desafiar código de outros programadores. Pode-se programar em C++, C# e Java. Tem um fórum ótimo pra discussão e um ranking com, possivelmente, alguns dos melhores competidores do mundo (no Google Code Jam quem ganhou algumas vezes com o ACRush, segundo colocado do Algorithms do TopCoder). Além de ter mais competições (Design, Studio, Marathon).

Livros:

  • Introduction to Algorithms, CLRS (o livrão branco de algoritmos);
  • Programming Challenges, Skiena & Revilla;
  • Algorithms in C, Sedgewick;
  • Concrete Mathematics, Knuth et al.

Quem quiser dar uma estudada BOA em matemática, manda ver. Tem muitos problemas que envolvem Teoria dos Números, Probabilidade e Geometria Computacional.

Mais alguns links interessantes:

Além desses eu tinha um caderno com os algoritmos que precisava em C++, mas não sei onde enfiei :oops: Era tipo um memorex com Dijkstra, BSF, GDC e mais alguns úteis. Quem procurar pelo caderno da PUC RJ possivelmente vai achar. Além desse tem um caderno de algoritmos de um competidor (Vinícius Fortuna) que está hoje no Google. Ele tem muitas dicas pra quem quere entrar no caminho.

Enfim, aí ficaram algumas dicas. O principal pra se dar bem nessas competições? Não tem fórmula mágica: resolver, resolver e resolver.

[Editado2]
Quem fica nas primeiras colocações nessas competições geralmente atinge um lugar ótimo pra se trabalhar. Vide aqui e aqui dois casos interessantes.

[Editado3]
Se atentem aos limites das entradas. Se o problema diz que vai entrar de 0 a 2³²¹²¹², vai acontecer de colocar o maior valor. Portanto, long long (C++) e BigInteger (Java) neles. Alguns casos até quem tem que implementar isso é você (principalmente quando existem números absurdos). Existem algoritmos prontos pra fazer isso, é só pegar, entender e implementar.

E se atentem BASTANTE à performance.

A

Tinha entendido, foi frescura minha… :stuck_out_tongue:

A

Eu participava do UVA (http://uva.onlinejudge.org/). Também é muito bom. :smiley:

O site está com um bug para acessar… às vezes não acessa, só quando remove os cookies… não testaram antes de submeter? kkk

L

Para a maratona, aconselho altamente usar C ou C++.
Java só para usar para problemas com BigDecimal, BigNumber, etc.
Na maratona, Java perde muito em relação à performance e memória, por conta da orientação a objetos. E nesse tipo de contest, vai ser muuuuito raro precisar usar uma instância de uma classe criada. Programação “procedural” dá conta do recado numa boa.

Já teve caso de quando participei fazer o programa em java, não passar (resposta errada), aí tentamos em C (o mesmo algoritmo) e passou.
Bem, em todo caso, não custa ir sabendo C/C++. Se não der certo com um, tenta com outro! :slight_smile:

A

Como era esse caso? Você ainda tem o algoritmo?

[]'s

L

Como era esse caso? Você ainda tem o algoritmo?

[]'s

Não tenho mais. Mas foi na maratona de 2007. Era coisa bem simples, bem boba.
O código java ficou igualzinho ao do C, só mudou o public static void main para main do C.
Perdemos quase 15 minutos no problema na época, enquanto as outras equipes gastavam menos de 5 minutos.
Por isso recomendo saber as 2 linguagens para a maratona.

A

Pior são os casos que parecem que é de performance mas é de lógica… tivemos um desse uma vez e fizemos 5 versões do problema (Java, 2 em C++ e 2 e C)… no final descobrimos que tinha um situação que executava muito mais iterações e estourava o tempo.

Por esta e outras que deve-se estar atento aos resultados das submissões… nem sempre o erro que parece é o que realmente é.

B

Pessoal,

É uma boa oportunidade para quem quer testar seus conhecimentos na construção algorítmos
complexos para resolução de problemas difíceis.

Tive a oportunidade de participar nas regionais com o time de Ciência da Computação da FASP em 2003, na
época um time do IME/USP foi campeão da regional resolvendo os 5 problemas da competição porém a
Universidad de Buenos Aires foi a campeã da América do Sul e foi disputar o mundial no Hawaii. :smiley:

Para preparação recomendo o site da UVa com um banco de dados com problemas de competições passadas:
http://www.uvatoolkit.com/problemssolve.php

Um livro de Algoritmos:
Algoritimos - Teoria e Prática - Thomas H. Cormen

Site competições passadas:
http://icpc.baylor.edu/past/

J

eu participei da regional do ano passado…
quando participa pela primeira vez a gente peca muito por falta de experiência, mas é muito bom. Recomendo mesmo.
Nesse ano acho que vou entrar novamente.

Os problemas em sua grande maioria não geram códigos grandes, mas tem uma lógica meio complexa…sintaxe nunca é o problema, até pq pode levar livros ou algum material.
O que mais pega é vc fazer algo sem montar uma estratégia bem montada e no final ter de refazer tudo ou perder tempo revisando o que deu erro…

mas é bom mesmo… :smiley:

J

Como era esse caso? Você ainda tem o algoritmo?

[]'s

Não tenho mais. Mas foi na maratona de 2007. Era coisa bem simples, bem boba.
O código java ficou igualzinho ao do C, só mudou o public static void main para main do C.
Perdemos quase 15 minutos no problema na época, enquanto as outras equipes gastavam menos de 5 minutos.
Por isso recomendo saber as 2 linguagens para a maratona.

Depende da métrica do servidor, mas te juro que até hoje não consigo entender isso. Se o algoritmo é o mesmo o servidor não pode recusar. E atenção que para algoritmos curtos o hotspot otimiza 3x mais que um programa c com otimizador no 2x.

Um exemplo simples é gerar séries harmônicas. Em um loop de 36 pontos o assembly java consegue resolver o problema em 300 ms, enquanto c resolveu em 530 s na minha máquina e c++ resolveu em 700(sem otimização ativada).

Então um código gerado com o hotspot tem mais vantagens em problemas pequenos devido as diversas otimizações.

J

Loiane:
Para a maratona, aconselho altamente usar C ou C++.
Java só para usar para problemas com BigDecimal, BigNumber, etc.
Na maratona, Java perde muito em relação à performance e memória, por conta da orientação a objetos. E nesse tipo de contest, vai ser muuuuito raro precisar usar uma instância de uma classe criada. Programação “procedural” dá conta do recado numa boa.

Já teve caso de quando participei fazer o programa em java, não passar (resposta errada), aí tentamos em C (o mesmo algoritmo) e passou.
Bem, em todo caso, não custa ir sabendo C/C++. Se não der certo com um, tenta com outro! :slight_smile:

A questão dos números de grande precisão podem ser resolvidos como o Andre falou (long long).
Um quesito desleal seria operações com string.

java possui a classe String
c++ possui a classe _string na STL

c não possui nenhuma. O string é um ponteiro para um vetor de caracteres na memória. Implementar um substring aí pode ser uma tarefa que vai te fazer perder algum tempo.
char[255] string;

Agora usar um objeto String vai me fazer perder desempenho? Não necessáriamente porque o hotspot vai melhorar o código para mim, enquanto em c o seu código vai permanecer o mesmo. Para você ver uma grande diferença de desempenho do código java para um c(muito bem elaborado) somente em operações muito críticas.

A

Julio,

O problema de o Java ser considerado lento na maratona não tem a ver com a entrada? No TopCoder, por exemplo, nunca tive problemas com Java, enquanto que na Maratona (seja SPOJ ou UVa) não me dava muito bem com Java.

No TopCoder é um método. Então, na descrição do problema, ele dá a assinatura do método, não implicando em problemas de leitura de entradas muito grandes.

J

Andre Brito:
Julio,

O problema de o Java ser considerado lento na maratona não tem a ver com a entrada? No TopCoder, por exemplo, nunca tive problemas com Java, enquanto que na Maratona (seja SPOJ ou UVa) não me dava muito bem com Java.

No TopCoder é um método. Então, na descrição do problema, ele dá a assinatura do método, não implicando em problemas de leitura de entradas muito grandes.

entendi.

A

juliocbq:
Andre Brito:
Julio,

O problema de o Java ser considerado lento na maratona não tem a ver com a entrada? No TopCoder, por exemplo, nunca tive problemas com Java, enquanto que na Maratona (seja SPOJ ou UVa) não me dava muito bem com Java.

No TopCoder é um método. Então, na descrição do problema, ele dá a assinatura do método, não implicando em problemas de leitura de entradas muito grandes.

entendi.


Podem existir problemas que a solução requer muito processamento. Daí pode não ser possível submeter em Java, mesmo com a algoritmo válido e feito da melhor forma possível, porque passa o tempo limite.

Tem alguns desses problemas que as respostas podem ser pré-calculadas e feito um código que seleciona uma dessas respostas para cada entrada… mas são poucos.

R

Uma dúvida: peguei a prova do ano passado e não vi nas questões a definição de um tempo limite, porém nas regras consta que se exceder o tempo limite o exercicio não é aprovado. Esse tempo limite é o mesmo para todas as questões? Ou então como fico sabendo o tempo limite de processamento de cada questão?

J

Adelar:
juliocbq:
Andre Brito:
Julio,

O problema de o Java ser considerado lento na maratona não tem a ver com a entrada? No TopCoder, por exemplo, nunca tive problemas com Java, enquanto que na Maratona (seja SPOJ ou UVa) não me dava muito bem com Java.

No TopCoder é um método. Então, na descrição do problema, ele dá a assinatura do método, não implicando em problemas de leitura de entradas muito grandes.

entendi.


Podem existir problemas que a solução requer muito processamento. Daí pode não ser possível submeter em Java, mesmo com a algoritmo válido e feito da melhor forma possível, porque passa o tempo limite.

Tem alguns desses problemas que as respostas podem ser pré-calculadas e feito um código que seleciona uma dessas respostas para cada entrada… mas são poucos.

Sim, mas esse lance de processamento não tem nada a ver. O que eu estou tentando passar é que java como uma “ferramenta” é 3x ou mais vezes robusto que um compilador de linguagem c porque inclui muitos recursos que o segundo não possui(não contando questões de linguagem). Novamente o hotspot torna a competição “desleal” entende?

para você ter uma idéia, o exemplo que dei acima sobre séries harmônicas levou 3 dias para eu conseguir otimizar(em c++) para competir com o mesmo java, e mesmo assim só chegou perto, não consegui bater.

Tenho experiência de 10 anos em c++ e linguagem c, e em Maratonas e Olimpíadas imagino que seja injusto comparar um código c com um java em questões de desempenho e em simples resolução de problemas(quem usa java tem o código otimizado automaticamente, não por mérito do programador). Porque?

Por causa do hotspot e por java ser uma linguagem de alto nível. Java e C são linguagens que alvejam pontos completamente diferentes.

V

Eu também acho injusto. Até porque o Garbage Collector é um excelente memory manager. E ele tem parte ativa no problema, cria gerações de objeto, faz processos em runtime.

É bem diferente do C, onde o malloc aloca memória e o free desaloca, sem qualquer tipo de checagem de runtime.

Não acho que seria justo comparar porque não se tratam de linguagens diferentes, mas sim, de plataformas diferentes.

J

ViniGodoy:
Eu também acho injusto. Até porque o Garbage Collector é um excelente memory manager. E ele tem parte ativa no problema, cria gerações de objeto, faz processos em runtime.

É bem diferente do C, onde o malloc aloca memória e o free desaloca, sem qualquer tipo de checagem de runtime.

Não acho que seria justo comparar porque não se tratam de linguagens diferentes, mas sim, de plataformas diferentes.


Sim, isso mesmo.

A

Algumas provas não tem. Outras tem. Me lembro que no SPOJ diz o tempo limite. Em geral, você não sabe. Tem que praticar o suficiente pra conseguir identificar trechos que comem tempo. A quantidade de “Time Limit Exceed”, vulgo TLE, já me deixou chateado muitas vezes. O algoritmo tem que estar correto e ser rápido (eliminar for, em alguns casos, for dentro de for é caixão).

A

Adelar:
juliocbq:
Andre Brito:
Julio,

O problema de o Java ser considerado lento na maratona não tem a ver com a entrada? No TopCoder, por exemplo, nunca tive problemas com Java, enquanto que na Maratona (seja SPOJ ou UVa) não me dava muito bem com Java.

No TopCoder é um método. Então, na descrição do problema, ele dá a assinatura do método, não implicando em problemas de leitura de entradas muito grandes.

entendi.


Podem existir problemas que a solução requer muito processamento. Daí pode não ser possível submeter em Java, mesmo com a algoritmo válido e feito da melhor forma possível, porque passa o tempo limite.

Tem alguns desses problemas que as respostas podem ser pré-calculadas e feito um código que seleciona uma dessas respostas para cada entrada… mas são poucos.


Pois é, mas como explicar o que acontece no TopCoder?
Acredito eu que seja mais problema na leitura das entradas do que no processamento em si. Ou algum problema de memória que pode estourar a memória alocada no servidor pro problema.

V

Memória é um problema sério para o Java. O Garbage Collector é rápido, mas também consome muito mais memória do que se pode fazer em C.

R

Algumas provas não tem. Outras tem. Me lembro que no SPOJ diz o tempo limite. Em geral, você não sabe. Tem que praticar o suficiente pra conseguir identificar trechos que comem tempo. A quantidade de “Time Limit Exceed”, vulgo TLE, já me deixou chateado muitas vezes. O algoritmo tem que estar correto e ser rápido (eliminar for, em alguns casos, for dentro de for é caixão).

Nesse caso específico da Maratona de Programação ACM. Nas regras diz o seguinte:

“Para cada submissão o time recebe uma resposta, que pode ser satisfatória (e o problema está resolvido pelo time) ou indica algum erro ocorrido, como: resposta errada, tempo de execução excedido, erro de execução, erro de compilação, etc.”

Então, se eu participar da competição tenho que fazer o algortimo e mandar para a coordenação, ai ele vai me dizer se está no tempo de execução correto ou não? não tenho como prever isso durante a criação?
E depois que ele falar que o tempo excedeu, não ficarei sabendo quanto é esse tempo? É isso?

A

Algumas provas não tem. Outras tem. Me lembro que no SPOJ diz o tempo limite. Em geral, você não sabe. Tem que praticar o suficiente pra conseguir identificar trechos que comem tempo. A quantidade de “Time Limit Exceed”, vulgo TLE, já me deixou chateado muitas vezes. O algoritmo tem que estar correto e ser rápido (eliminar for, em alguns casos, for dentro de for é caixão).

Nesse caso específico da Maratona de Programação ACM. Nas regras diz o seguinte:

“Para cada submissão o time recebe uma resposta, que pode ser satisfatória (e o problema está resolvido pelo time) ou indica algum erro ocorrido, como: resposta errada, tempo de execução excedido, erro de execução, erro de compilação, etc.”

Então, se eu participar da competição tenho que fazer o algortimo e mandar para a coordenação, ai ele vai me dizer se está no tempo de execução correto ou não? não tenho como prever isso durante a criação?
E depois que ele falar que o tempo excedeu, não ficarei sabendo quanto é esse tempo? É isso?
Você manda e cada entrada é avaliada. Então é assim:

  • Teste 1: passou;
  • Teste 2: passou;
  • Teste 3: estourou o limite de tempo (TLE).

A partir daí, a resposta já volta pra você, como errada. Quando eu participava, não vinha nem a entrada que tinha estourado o tempo. O que eu conseguia ver era em quanto tempo o algoritmo era executado. Se desse TLE (Time Limit Exceed), mostrava quantos segundos havia levado. A única maneira de passar em TLE é resolvendo o problema da maneira correta e limpa. Resolver por resolver, qualquer um resolve. Mas resolver pra passar no tempo estipulado, aí é outra história. Por isso que um ponto principal nessas competições é Complexidade e Otimização, principalmente quando envolve Programação Dinâmica e Grafos, por exemplo.

Um exemplo, bem simples: fatorial. Voce tem que armazenar num array o que já foi calculado. Portanto, se a entrada for 10 e a próxima for 15, você não faz 15 * 14 * … * 3 * 2 * 1. Você faz 15 * 14 * 13 * 12 * 11 * o fatorial de 10 já guardado no array.

Outro exemplo bem básico: calcular números primos. Sem Crivo de Erastótenes não passa (vai dar TLE).

A

Para empolgar mais, recentemente dois ex-maratonistas do Centro de Informática da UFPE foram contratados pela Google, vide http://www2.cin.ufpe.br/site/lerNoticia.php?s=1&c=94&id=349 e http://www2.cin.ufpe.br/site/lerNoticia.php?s=1&c=94&id=352

C, C++ e Java.

Sim, porque todos os times possuem acesso às mesmas linguagens e APIs. Cabe a cada time escolher qual a linguagem utilizará no momento da submissão de cada problema, podendo alterar a linguagem a cada nova submissão se achar necessário.

É permitido levar quaisquer materiais impressos, por exemplo, livros, apostilas e trechos de códigos, porém não podem acessar Internet nem levar material magnético (pen drive e CD-ROM). Todo time que se preze possui um bom notebook (cadernos com rotinas prontas). Geralmente, utiliza-se C ou C++ por questão de cultura (da mesma forma que desenvolvedor ágil deveria utilizar Ruby e R. on Rails) e comodidade porque já há muito material escrito nestas linguagens.

A linguagem de programação termina sendo é irrelevante para os tipos de problema da maratona. A solução de um problema com um algoritmo ruim não será aceito, nem que o sujeito escreva o código em Assembly.

É a mesma: compara-se a saída gerada pela solução submetida com a solução esperada. Se as respostas forem iguais, a solução é aceita, senão rejeitada.

A

A informação está errada, porque o conjunto de testes é o mesmo, independente da linguagem de programação utilizada.

A

juliocbq:
Adelar:
A questão por escolher Java ou C quando participávamos na maioria das vezes se encaixava em um dos critérios: se a necessidade fosse por velocidade era C ou se fosse por estruturas de dados complexas, era Java. O C++ seria mais ou menos um meio termo entre as duas.

[]'s


C++ tem o mesmo nível da Java.

Mesmo assim não é tão justo não. O hotspot tem o jit para otimizar o código. Ou seja, pode ser 3 programadores x 1 programador se contar desempenho. Não estou criticando o evento não, é que sempre tive curiosidade de entender por que a competição não usa linguagens do mesmo nível. Ex:

C++ vs Java;

Java vs C#;

Java vs ObjectPascal;

python x ruby;

Digo isso porque já participei de algumas (á alguns bons anos) e ninguém da coordenação conseguiu me explicar isso.

A linguagem de programação é irrelevante, porque é uma competição de projeto de algoritmos. Se você não utilizar um algoritmo que execute abaixo do limite de complexidade de tempo e memória máximo, não conseguirá ter sua solução aceita.

Escovar bits ou trocar a linguagem de programação não fará a complexidade de seu algoritmo sair de O(n!) para O(log n).

A

juliocbq:
Marky.Vasconcelos:

@topic
Eu sou elegivel para participar e ainda estou na faculdade, só falta um time para isso. =/

Eu encararia uma olimpíada dessas mas já passei de ser elegível faz tem rsrsrsrs…

Sugiro as competições do TopCoder para você. Veja o site http://www.topcoder.com/tc.

Marky.Vasconcelos:

Chegar lá com uns algoritmos de busca inteligentes na ponta do dedo te dá uma grande chance de boa pontuação.

Não é o suficiente. É preciso entender o problema, modelar a solução adequada e implementá-la, porque os problemas não são aplicações diretas de algoritmos clássicos na grande maioria dos casos. A parte mais fácil é a implementação em si.

A

Loiane:
Para a maratona, aconselho altamente usar C ou C++.
Java só para usar para problemas com BigDecimal, BigNumber, etc.
Na maratona, Java perde muito em relação à performance e memória, por conta da orientação a objetos. E nesse tipo de contest, vai ser muuuuito raro precisar usar uma instância de uma classe criada. Programação “procedural” dá conta do recado numa boa.

Já teve caso de quando participei fazer o programa em java, não passar (resposta errada), aí tentamos em C (o mesmo algoritmo) e passou.
Bem, em todo caso, não custa ir sabendo C/C++. Se não der certo com um, tenta com outro! :slight_smile:

Deve ter sido lentidão com entrada e saída apenas.

A

juliocbq:
Loiane:
Para a maratona, aconselho altamente usar C ou C++.
Java só para usar para problemas com BigDecimal, BigNumber, etc.
Na maratona, Java perde muito em relação à performance e memória, por conta da orientação a objetos. E nesse tipo de contest, vai ser muuuuito raro precisar usar uma instância de uma classe criada. Programação “procedural” dá conta do recado numa boa.

Já teve caso de quando participei fazer o programa em java, não passar (resposta errada), aí tentamos em C (o mesmo algoritmo) e passou.
Bem, em todo caso, não custa ir sabendo C/C++. Se não der certo com um, tenta com outro! :slight_smile:

A questão dos números de grande precisão podem ser resolvidos como o Andre falou (long long).

Tenta resolver estes dois problemas com long long :wink:

É trivial e você ainda pode levar rotinas normalmente utilizadas por escrito.

A

Na Maratona, não fica sabendo :slight_smile: O indicativo do limite de tempo pode sugerir o tamanho dos casos de teste e, principalmente, a complexidade da solução desejada.

A

De 2008 pra cá, posso afirmar que o tempo é o mesmo para todas as linguagens de programação. Muito provavelmente, sempre foi assim.

G

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

M

Os problemas são estilo os do TopCoder então?

R

Marky,

Não conheço os problemas do TopCoder, mas na página da competição tem as provas dos anos anteriores para você comparar.

A

A forma de ler as entradas é diferente do TopCoder, mas os problemas são dentro dos moldes. Tanto do TopCoder como do Google Code Jam e da OBI.

J

alankelon:
juliocbq:
Loiane:
Para a maratona, aconselho altamente usar C ou C++.
Java só para usar para problemas com BigDecimal, BigNumber, etc.
Na maratona, Java perde muito em relação à performance e memória, por conta da orientação a objetos. E nesse tipo de contest, vai ser muuuuito raro precisar usar uma instância de uma classe criada. Programação “procedural” dá conta do recado numa boa.

Já teve caso de quando participei fazer o programa em java, não passar (resposta errada), aí tentamos em C (o mesmo algoritmo) e passou.
Bem, em todo caso, não custa ir sabendo C/C++. Se não der certo com um, tenta com outro! :slight_smile:

A questão dos números de grande precisão podem ser resolvidos como o Andre falou (long long).

Tenta resolver estes dois problemas com long long :wink:

É trivial e você ainda pode levar rotinas normalmente utilizadas por escrito.

Se não puder resolver um problema com long long pode-se alocar memória com malloc e criar um outro tipo. Isso não é nenhum problema.

Levar rotinas predefinidas? Isso não deixa mais trabalhoso de se usar c?

J

alankelon:
De 2008 pra cá, posso afirmar que o tempo é o mesmo para todas as linguagens de programação. Muito provavelmente, sempre foi assim.
Antes do jit java ficava 5x ou mais vezes atraz de um assembly nativo. Hoje pode rodar até mais rápido que um programa c graças ao LLVM.
http://llvm.org/

Não tem como comparar java com c, é uma coisa completamente diferente, é uma plataforma diferente. Por mais que você se esforce, não tem como você otimizar seu código mais que o jit facilmente. Podemos até fazer uma brincadeira aqui para testar…

O seguinte software é a implementação do fibonacci. Refiz o mesmo algoritmo em c(médio nível) e c++(alto nível). O programa c++ resolve o problema em 520ms, o c resolve em 600 ml, c# resolve em 360 ms e java em 270 ms em uma máquina dual core com 2gb(O tempo de resposta vai variar conforme o processador, mas a vai seguir o mesmo ponto de referência. Se você acha que é justo comparar uma plataforma como java a uma outra como c, pode tentar bater o tempo do java. Se conseguir, observe a dificuldade que teve para otimizar uma coisa que pode ser feita em menos de 1min em java.

J

alankelon:
Para empolgar mais, recentemente dois ex-maratonistas do Centro de Informática da UFPE foram contratados pela Google, vide http://www2.cin.ufpe.br/site/lerNoticia.php?s=1&c=94&id=349 e http://www2.cin.ufpe.br/site/lerNoticia.php?s=1&c=94&id=352

C, C++ e Java.

Sim, porque todos os times possuem acesso às mesmas linguagens e APIs. Cabe a cada time escolher qual a linguagem utilizará no momento da submissão de cada problema, podendo alterar a linguagem a cada nova submissão se achar necessário.

É permitido levar quaisquer materiais impressos, por exemplo, livros, apostilas e trechos de códigos, porém não podem acessar Internet nem levar material magnético (pen drive e CD-ROM). Todo time que se preze possui um bom notebook (cadernos com rotinas prontas). Geralmente, utiliza-se C ou C++ por questão de cultura (da mesma forma que desenvolvedor ágil deveria utilizar Ruby e R. on Rails) e comodidade porque já há muito material escrito nestas linguagens.

A linguagem de programação termina sendo é irrelevante para os tipos de problema da maratona. A solução de um problema com um algoritmo ruim não será aceito, nem que o sujeito escreva o código em Assembly.

É a mesma: compara-se a saída gerada pela solução submetida com a solução esperada. Se as respostas forem iguais, a solução é aceita, senão rejeitada.

  1. Se somente as saídas forem comparadas, a competição se torna muito injusta por questões de sintaxe das linguagems.

  2. Eu entendi que todos podem usar as mesmas linguagem. Mas porque alguém escolheria c ao invés de java? Estou tentando imaginar uma boa razão para alguém usar c numa competição que só verifica as saídas e o tempo de execução do programa(A não ser que o tempo de execução seja medido em unidades, e não em ciclos de um processador).

A

juliocbq:
Se não puder resolver um problema com long long pode-se alocar memória com malloc e criar um outro tipo. Isso não é nenhum problema.

Levar rotinas predefinidas? Isso não deixa mais trabalhoso de se usar c?


Levar rotinas predefinidas é levar algoritmos já escritos em papel. Vide aqui alguns pdfs interessantes: http://maratona.viniciusfortuna.com/Notebooks

E sobre os números… Com malloc acho que ainda não resolve. Existe um algoritmo que, pra variar, não consigo me lembrar o nome, onde você pega um número muito grande e soma com outro tão grande quanto. Não só operação de soma, mas subtração, multiplicação e divisão também. Senão me engano o algoritmo consiste em pegar de 4 em 4 dígitos e ir fazendo operações nestes, ao invés de no número como um todo. No que eu ache o algoritmo volto a postar aqui (a memória tá fraca).

Julio, não verifica só as saídas. Se estourar o tempo limite ou memória, já é motivo de erro. Se for pra mostrar só a saída não tem graça :stuck_out_tongue:

J

Andre Brito:
juliocbq:
Se não puder resolver um problema com long long pode-se alocar memória com malloc e criar um outro tipo. Isso não é nenhum problema.

Levar rotinas predefinidas? Isso não deixa mais trabalhoso de se usar c?


Levar rotinas predefinidas é levar algoritmos já escritos em papel. Vide aqui alguns pdfs interessantes: http://maratona.viniciusfortuna.com/Notebooks

E sobre os números… Com malloc acho que ainda não resolve. Existe um algoritmo que, pra variar, não consigo me lembrar o nome, onde você pega um número muito grande e soma com outro tão grande quanto. Não só operação de soma, mas subtração, multiplicação e divisão também. Senão me engano o algoritmo consiste em pegar de 4 em 4 dígitos e ir fazendo operações nestes, ao invés de no número como um todo. No que eu ache o algoritmo volto a postar aqui (a memória tá fraca).

Julio, não verifica só as saídas. Se estourar o tempo limite ou memória, já é motivo de erro. Se for pra mostrar só a saída não tem graça :p

ahh sim, aí é outra coisa. Senão quem usa java tem muita vantagem.

A

Pois é. O Petr, primeiro colocado do TopCoder e GCJ (algumas vezes), usava Pascal quando participava de Maratonas da ACM. Numa entrevista, ele fala que a única coisa que ele sente pesar é de não ter Pascal no TopCoder. Quando perguntado porque usava Java, a resposta foi muito legal:

J

Pois é. O Petr, primeiro colocado do TopCoder e GCJ (algumas vezes), usava Pascal quando participava de Maratonas da ACM. Numa entrevista, ele fala que a única coisa que ele sente pesar é de não ter Pascal no TopCoder. Quando perguntado porque usava Java, a resposta foi muito legal:

com certeza… Se não houver critérios diferentes na análise o competidor vai ter que ser muito bom em c para ganhar de um que não possui tantos conhecimentos em algoritmos.
Java facilita muito.

A

Repito: a linguagem de programação é completamente irrelevante para os problemas da Maratona de Programação.

juliocbq, saia do campo das suposições, submeta o programa que você programa que você escreveu, veja o resultado e depois volte aqui para comentar.

J

alankelon:
Repito: a linguagem de programação é completamente irrelevante para os problemas da Maratona de Programação.

juliocbq, saia do campo das suposições, submeta o programa que você programa que você escreveu, veja o resultado e depois volte aqui para comentar.

Não é nenhuma suposição não, é um fato. O programa foi postado lá no alto para qualquer pessoa analizar. É um simples fibonacci.
Se você conseguir otimizar o mesmo algoritmo em uma linguagem diferente(c, c++ …) sem alguma dificuldade poste para nós. Aliás vou aprender muito com isso.

A

Insisto que você resolva os problemas sugeridos para entender que sua fala não faz sentido no contexto da Maratona de Programação.

Outro problema que mostra que o mais importante é o algoritmo e não a linguagem de programação é http://br.spoj.pl/problems/PRIME1

Divirta-se.

A

juliocbq:
alankelon:
Repito: a linguagem de programação é completamente irrelevante para os problemas da Maratona de Programação.

juliocbq, saia do campo das suposições, submeta o programa que você programa que você escreveu, veja o resultado e depois volte aqui para comentar.

Não é nenhuma suposição não, é um fato. O programa foi postado lá no alto para qualquer pessoa analizar. É um simples fibonacci.
Se você conseguir otimizar o mesmo algoritmo em uma linguagem diferente(c, c++ …) sem alguma dificuldade poste para nós. Aliás vou aprender muito com isso.

Simples: reescreva a função fibonacci de forma iterativa e use memoization.

J

alankelon:
juliocbq:
alankelon:
Repito: a linguagem de programação é completamente irrelevante para os problemas da Maratona de Programação.

juliocbq, saia do campo das suposições, submeta o programa que você programa que você escreveu, veja o resultado e depois volte aqui para comentar.

Não é nenhuma suposição não, é um fato. O programa foi postado lá no alto para qualquer pessoa analizar. É um simples fibonacci.
Se você conseguir otimizar o mesmo algoritmo em uma linguagem diferente(c, c++ …) sem alguma dificuldade poste para nós. Aliás vou aprender muito com isso.

Simples: reescreva a função fibonacci de forma iterativa e use memoization.

Tá bom, então faça lá e compare seu resultado com o do jit. Poste para nós vermos. Como é simples para você, não vai ter nenhum trabalho além poder colaborar e ajudar o guj a entender o problema proposto.

Eu levei 3 dias para poder compará-lo com a otimização do jit, e pelo visto você já levou um dia falando.

A
J

Você não leu o que eu escrevi no post lá em cima ou se fez de mal entendido?

A minha dúvida é: “Qual é a vantagem de usar c ao invés de java?”

O que eu propus foi usar uma linguagem como c ou c++ em um algoritmo como fibobacci e observar como o seu relativo(ou melhor a mesma implementação) em java é muito mais otimizado que nas primeiras linguagens. Isso porque o jit otimiza seu código, e pelo visto você não sabe disso.

A idéia é você implementar o mesmo software em c e ver se você consegue rodar mais rápido que o equivalente java sem sofrer um bocado para otimizá-lo.

Se você pelo menos tentar otimizar para você mesmo e comparar os resultados vai ver como é difícil competir com um otimizador do nível do jit e do LLVM também usados no hotspot.

É isso.

A

“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified” (Donald Knuth)

Você está tentando transferir sua responsabilidade de análise e projeto de algoritmos para a linguagem de programação, enquanto deveria pensar na complexidade do algoritmo. Para entradas pequenas, tudo funcionará.

O importante é abordar o problema da forma correta. As otimizações de compilação e execução de A ou B pouco importam para a Maratona de Programação e, via de regra, para otimização de qualquer sistema computacional.

J

alankelon:
“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified” (Donald Knuth)

Você está tentando transferir sua responsabilidade de análise e projeto de algoritmos para a linguagem de programação, enquanto deveria pensar na complexidade do algoritmo. Para entradas pequenas, tudo funcionará.

O importante é abordar o problema da forma correta. As otimizações de compilação e execução de A ou B pouco importam para a Maratona de Programação e, via de regra, para otimização de qualquer sistema computacional.

Não estou tentando transferir a responsabilidade do algoritmo para a linguagem. Estou te dizendo que java já faz isso automáticamente na plataforma.

A otimização prematura que o Knuth está dizendo é quando um programador implementa o algoritmo já visando otimizá-lo, e isso é prejudicial para ele mesmo porque se torna mais passível a erros.

Mas só me fala uma coisa. O executável final é analizado ou somente o código fonte?

A

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

J

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

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”.




A

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

J

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

R

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

J

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

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.

A

Me intrometendo e colocando os meus "achos" na discussão...

RafaelViana:
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?

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.
RafaelViana:
Por que a maioria das equipes preferem usar o C++ sendo que o Java tem uma linguagem mais simples (na minha opinião)?
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.
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));
		}
	}
}

[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

A

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.

J

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?

A

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

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.

A

Queria que você me provasse e parace de falar. :smiley:

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

J

Queria que você me provasse e parace de falar. :smiley:

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

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!?

A

Legal! Então fim de papo.

M

Boa tarde tem este exercício resolvido em C++?? se tiver poderia me enviar no e-mail [email removido].

Motivo: para fins academicos.
Obrigado.

Marcelo.

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

W

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.

W

alankelon:
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.

A informação está errada, porque o conjunto de testes é o mesmo, independente da linguagem de programação utilizada.


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.

Criado 3 de maio de 2011
Ultima resposta 6 de mai. de 2011
Respostas 95
Participantes 20