Ajuda em algoritmo

Tentei resolver sem êxito esse problema proposto na 2ª Maratona de Programação de Açores.
link:

http://www.uac.pt/~hguerra/Maratona/ProblemasMaratona2005.pdf

Problema 1
O objectivo deste problema é calcular o número de vezes que um número inteiro ocorre numa lista de seis números inteiros que variam entre 0 e 4095.
Valores de Entrada
A entrada consiste numa linha com o número, cujo número de ocorrências pretendemos calcular, seguindo-se uma segunda linha com uma lista de seis números entre 0 e 4095 separados por um espaço em branco.
Valores de Saída
Deve sair o número de vezes que o inteiro ocorre na lista.
Exemplo
Valores de Entrada
32
1 32 10 0 32 5
Valores de Saída
2


Espero que compreendam minha tentativa de solução e se possível me indiquem onde estou errando e como poderia ser otimizado meu algoritmo.

import java.io.*;

public class Maratona1 {

   public static void main(String[] args) throws IOException {
   
      int vezes = 0;
      String[] valores = {"", "", "", "", "", ""};
      BufferedReader bf1 = new BufferedReader(new InputStreamReader(System.in));
      String line1 = bf1.readLine();
      int valor = Integer.parseInt(line1);
      BufferedReader bf2 = new BufferedReader(new InputStreamReader(System.in));
      String line2 = bf2.readLine();
      for(int i = 0; i < line2.length(); i++) {
         if(String.valueOf(line2.charAt(i)).equals(" "))
            break;
         else  
           while(! String.valueOf(line2.charAt(i)).equals(" "))   
              valores[i] = valores[i] + line2.charAt(i);  
      if(Integer.parseInt(valores[i]) == valor)
         vezes++;   
      }

      System.out.println(vezes);      

   }

}

eu faria assim…

      int vezes = 0;
      BufferedReader bf1 = new BufferedReader(new InputStreamReader(System.in));
      String line1 = bf1.readLine();
      int valor = Integer.parseInt(line1);
      BufferedReader bf2 = new BufferedReader(new InputStreamReader(System.in));
      String line2 = bf2.readLine();
      int count = 0;
      String substring;
      while((count = line2.indexOf(" ")) != -1){
          substring = line2.substring(0,count);
          if(substring.equals(line1))
            vezes++;
          line2 = line2.substring(count+1,line2.length());
      }
      
      if((line2.substring(0,line2.length())).equals(line1))
        vezes ++;
      
      System.out.println(vezes);    

Tah, assim, teu programa ali encima tah confuso, isso aqui é um looping infinito:

               while (!String.valueOf(line2.charAt(i)).equals(" "))
                  valores[i] = valores[i] + line2.charAt(i);

e ainda olhando essa linha aqui embaixo:

if (Integer.parseInt(valores[i]) == valor) vezes++;

parece que vc quer jogar todos valores do line2 em um vetor int e ai comparar, soh que ai tem outro erro, vc naum pode usar o mesmo contador para ‘line2’ e ‘valores’ neh?! pow, line2 tem tamanho maior que 6, se não desse um looping infinito ali, daria um ArrayIndexOfBound.

Colocando mais umas gambiarras ai no seu codigo, ficaria assim:

         int c2 = 0;
         for (int i = 0; i < line2.length(); i++, c2++)
         {
            if (String.valueOf(line2.charAt(i)).equals(" "))
               break;
            else
               while ((line2.length() > i) && (!String.valueOf(line2.charAt(i)).equals(" ")))
               {
                  valores[c2] = valores[c2] + line2.charAt(i);
                  i++;
               }

            if (Integer.parseInt(valores[c2]) == valor) vezes++;
         }

e ai funcionaria… mas não tah muito bonito não ehhe, isso da para fazer com expressões regulares, mas pelo que vi os problemas da maratona, parece que é para ver se vcs sabem usar vetores, então eu resolveria assim:

      int vezes = 0;
      BufferedReader bf1 = new BufferedReader(new InputStreamReader(System.in));
      String line1 = bf1.readLine().trim();
      BufferedReader bf2 = new BufferedReader(new InputStreamReader(System.in));
      String line2 = bf2.readLine().trim();

      String[] split = line2.split(" ");
      for (int i = 0; i < split.length; i++)
      {
         if (line1.equals(split[i])) vezes++;
      }
      System.out.println(vezes);

vlw!

Ae amigo, eu participei da maratona de programação de 2006…Realmente é cada código maluco que aparece…
Esse daí, eu fiz rapidinho aqui, acho que desse jeito fica mais fácil, só não verifiquei o intervalo entre 0 e 4095.

Acredito que esse seria a forma mais simples, tanto que na maratona o pessoal que fazia com java utilizava mais ou menos esse esuqema de leitura em arquivo. No meu caso o arquivo com os dados pra teste se chama Pasta1.txt.
Segue o código:

[code]public class teste3 {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	String arq= "C://Pasta1.txt";
	String x = null;

	int cont=0;
	int verifica=0;
	try {
		BufferedReader buff = new BufferedReader(new FileReader(arq));
		try {
			verifica=Integer.parseInt(buff.readLine());
			System.out.println(verifica);
			while((x=buff.readLine())!=null){
						
				StringTokenizer st = new StringTokenizer(x);
		        while (st.hasMoreTokens()) {
                	if (verifica==Integer.parseInt(st.nextToken()))	
                		cont++;
                }
   		
			}
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		System.out.println(e.getMessage());
	}
	
	System.out.println(cont);
}

}
[/code]

Avise se te ajudou!!

Você participou dessa maratona que eu citei?

Eu nunca participei de uma maratona de programação, vou participar de uma daqui a poucos meses, por isso estou pesquisando a respeito. E pelo que tenho visto, nessas maratonas o que conta é o problema resolvido em menos tempo possível. A clareza, elegância, portabilidade do código não é necessária e nem seria apropriada para esse tipo de competição.

Qualquer ajuda será bem vinda! Obrigado por postarem seus códigos. Vou verificar com calma. Se eu me atrapalhar de novo eu volto a pedir socorro.
Obrigado mesmo!

Eu participei da fase Regional e fui classificado para a fase Nacional que ocorreu em outubro do ano passado no Rio de Janeiro.
Só que na fase Regional meu time e eu fizemos feio…rsrs…
Agente estava no último período do curso, cheio de trabalho, escrevendo o Trabalho de Conclusão de Curso…fomos pro RJ mais pra conhecer a cidade do que pra fazer a prova…
A maratona que eu citei é a da ACM e IBM.

Cara, é bem legal e muito difícil, tem cada algoritmo sem noção nenhuma…
Eles dão o problema, explicam o que você vai receber de parâmetro e o significado deles, à partir daí você tem que desenvolver o algoritmo e eles dão uns 2 casos de teste pra você testar se está funcionando…o problema é que você testa com os casos que eles passam e cria uns na hora pra teste, mas depois de submeter seu código, eles testam com valores muito grandes, justamente para verificar a existência de erros e performance do código (que tem um tempo limite pra terminar a execução do teste).
Se você submete o código correto ganha tantos pontos, se teve erro, vc pode tentar resolver só que ganha uma penalização em tempo na próxima submissão.
Vence quem conseguir resolver o maior número de problemas no maior tempo possível ou em um intervalo de 5 horas.
Na fase nacional foram disponibilizados 9 problemas e o pessoal da PUC RIO conseguiu resolver os 9 … meu time resolveu 3…

A maioria do pessoal prefere programar em C, mas java e Pascal também podem ser utilizados. Meu time fez tudo em Java.
A estratégia, é cada um do time estudar uma coisa, pois os problemas precisam de diversas estruturas de dados ou pesquisa. É bom um especializar-se em pilha e lista, outro em árvore, matriz, grafos, métodos de ordenação…Assim, quando um pega um problema e tenta resolver, os outros olham os problemas restantes e se preparam até escrevendo já o código…assim, terminando um, às vezes já se tem a resposta de um segundo problema e o único tempo que você vai perder é pra digitar a solução.
Vale ressaltar que a fase regional a prova é em Português e na Nacional e Internacional a prova é em Inglês.
Nesse link tem uns exemplos, provas passadas, etc…
http://maratona.ime.usp.br/

[quote=“NewbieJava”][quote]
Ae amigo, eu participei da maratona de programação de 2006…Realmente é cada código maluco que aparece…
[/quote]

Você participou dessa maratona que eu citei?

Eu nunca participei de uma maratona de programação, vou participar de uma daqui a poucos meses, por isso estou pesquisando a respeito. E pelo que tenho visto, nessas maratonas o que conta é o problema resolvido em menos tempo possível. A clareza, elegância, portabilidade do código não é necessária e nem seria apropriada para esse tipo de competição.

Qualquer ajuda será bem vinda! Obrigado por postarem seus códigos. Vou verificar com calma. Se eu me atrapalhar de novo eu volto a pedir socorro.
Obrigado mesmo![/quote]

Eh cara, se vc tah se preparando para a maratorna que o cara citou no post anterior, pode ter certeza que vc tah fazendo exercicios muito faceis, eu cheguei a pensar que era maratorna de uma disciplina de faculdade (para não dizer, trabalho de faculdade). Tente resolver os problemas mais antigos da maratona que ele falou que vc vai estar bem mais preparado, procura eles ali a partir desse link::
http://maratona.ime.usp.br/antigas06.html

exemplo: http://maratona.ime.usp.br/hist/2005/primeira-fase/problem_set2005.pdf

É isso mesmo, você tem que se concentrar nos exercícios mais difíceis…Esse exemplo seu eles costumam dar no warmup (aquecimento antes da prova).

Geralmente a prova consta de um exercício fácil, 3 médios e 3 difíceis…