É o seguinte, estou tentando fazer um programa de treinamento para a Maratona de Programação, em java, que possui uma entrada de dados pelo console violenta!
A lógica do exercício é muito simples, o único problema é realmente a entrada dos dados (espero que seja só a entrada!!) que está MUITO lenta, em relação a um programa equivalente em linguagem C ou C++.
O exercício é assim: a entrada possui 2 linhas do console, e a saída 1 linha.
Na 1ª linha, deve ser digitado um inteiro N, que deve estar entre 0 e 100000. Esse N indica o número de peças do exercício.
Na 2ª linha, deve-se digitar N valores int ou float, separados por um espaço cada. Exemplo: 1 2.2 3.3. Os valores podem variar entre 0.00 a 1000.00. Esses valores indicam a medida de cada peça.
Na 3ª linha, se tem a saída do programa, que deve apresentar na tela a QUANTIDADE DE PEÇAS que possuem medida ACIMA DA MÉDIA. (a média das medidas das peças)
O programa só termina de executar quando N for igual a 0.
Exemplo da execução do programa:
3
4 5 6
1
5
1 2 9 8 9
3
0
No primeiro caso de teste, N=3, portanto 3 medidas logo abaixo. A média entre 4,5 e 6 é 5.00, portanto, apenas uma medida ficou acima da média, a medida 6.
No segundo caso de teste, N=5, portanto 5 medidas logo abaixo. A média entre 1,2,9,8 e 9 é 5.80, portanto, 3 medidas ficaram acima da média, 9,8 e 9.
No terceiro caso de teste, N=0, portanto o programa termina.
Esse é o programa que fiz:
import java.util.Locale;
import java.util.Scanner;
/*
Tive que deixar o nome da classe em minúsculo mesmo,
porque é exigido assim o nome do exercício na Maratona de Programação.
*/
public class pecas2 {
public static void main(String[] args) {
int N, qtdAcimaMedia;
float medidas[], mediaDasMedidas;
//Para poder digitar float com ponto, e não com vírgula.
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
do {
//Reseta as variáveis
qtdAcimaMedia = 0;
mediaDasMedidas = 0.0f;
//Lê o número de peças
N = sc.nextInt();
//Sai do programa, se o número de peças for zero.
if(N==0)
break;
//Instancia um array de floats.
medidas = new float[N];
//Pega os valores das medidas das peças e já vai somando para tirar a média depois.
for(int i=0; i<N; i++) {
medidas[i] = sc.nextFloat();
mediaDasMedidas += medidas[i];
}
//Tira a média.
mediaDasMedidas /= N;
//Faz a contagem de quantas peças possuem medida acima da média.
for(int i=0; i<N; i++) {
if(medidas[i] > mediaDasMedidas)
qtdAcimaMedia++;
}
//Apresenta a saída na tela.
System.out.println(qtdAcimaMedia);
} while(N!=0);
}
}
Foi feito da maneira mais simples possível, mas não passou no teste do programa usado na Maratona de Programação (BOCA), excede o tempo limite.
Um professor meu deixou um Pentium 4 como servidor, com o BOCA rodando para analisar os códigos, para os alunos poderem submeter os exercícios.
Todos os alunos que fizeram em C ou C++ conseguiram resposta positiva do BOCA. Acho que sou o único que está tentando fazer todos os exercícios em java.
Já tentei modificar meu programa, usando LinkedList, ArrayList, Iterator, InputStreamReader e BufferedReader, mas mesmo assim, excede o tempo limite (que acho que é de 10s).
Alguém poderia tentar me ajudar, antes que eu tenha que descer meu nível, de Java para C?