SPOJ Brasil

Problem hidden
This problem was hidden by Editorial Board member probably because it has incorrect language version or invalid test data, or description of the problem is not clear.

SPOJ Problem Set (obi)

841. Estágio

Problema: ESTAGIO

Você conseguiu um estágio para trabalhar como programador na secretaria da sua escola. Como primeira tarefa, Dona Vilma, a coordenadora, solicitou que você aprimore um programa que foi desenvolvido pelo estagiário anterior. Esse programa tem como entrada uma lista de nomes e de médias finais dos alunos de uma turma, e determina o aluno com a maior média na turma. Dona Vilma pretende utilizar o programa para premiar o melhor aluno de cada turma da escola. O programa desenvolvido pelo estagiário anterior encontra-se no final (em C, C++ e Pascal).

Como você pode verificar, o programa na forma atual tem uma imperfeição: no caso de haver alunos empatados com a melhor média na turma, ele imprime apenas o primeiro aluno que aparece na lista.

Tarefa

Dona Vilma deseja que você altere o programa para que ele produza uma lista com todos os alunos da turma que obtiveram a maior média, e não apenas um deles. Você consegue ajudá-la nesta tarefa?

Entrada

A entrada é constituída de vários conjuntos de teste, representando várias turmas. A primeira linha de um conjunto de testes contém um número inteiro N (1 <= N <= 1000) que indica o total de alunos na turma. As N linhas seguintes contêm, cada uma, um par de números inteiros C (1 <= C <= 20000) e M (0 <= M <= 100), indicando respectivamente o código e a média de um aluno. O final da entrada é indicado por uma turma com N = 0.

Saída

Para cada turma da entrada seu programa deve produzir três linhas na saída. A primeira linha deve conter um identificador do conjunto de teste, no formato “Turma n”, onde n é numerado a partir de 1. A segunda linha deve conter os códigos dos alunos que obtiveram a maior média da turma. Os códigos dos alunos devem aparecer na mesma ordem da entrada, e cada um deve ser seguido de um espaço em branco. A terceira linha deve ser deixada em branco. O formato mostrado no exemplo de saída abaixo deve ser seguido rigorosamente.

Exemplo

Entrada:
3
1 85
2 91
3 73
5
12300 81
12601 99
15023 76
10111 99
212 99
0

Saída:
Turma 1
2

Turma 2
12601 10111 212

Restrições

0 <= N <= 1000 (N = 0 apenas para indicar o fim da entrada)
1 <= C <= 20000
0 <= M <= 100

Código em Pascal
program estagio;
const MAX_ALUNOS = 1000;
type
    registro_aluno = record
                         codigo, media : integer;
                     end;
var
    alunos : array[1..MAX_ALUNOS] of registro_aluno;
    n, i, indice_melhor, turma : integer;
begin
    readln(n); { le numero de alunos da primeira turma }
    turma := 1;
    while n > 0 do begin
       for i := 1 to n do { le dados dos alunos }
          readln(alunos[i].codigo, alunos[i].media);
       indice_melhor := 1;
       for i := 2 to n do { procura aluno de maior media }
          if alunos[i].media > alunos[indice_melhor].media then
             indice_melhor := i;
       { escreve resposta }
       writeln('Turma ', turma);
       turma := turma + 1;
       writeln(alunos[indice_melhor].codigo);
       writeln;
       { le numero de alunos da proxima turma }
       readln(n);
    end;
end.
Código em C
#include <stdio.h>
#define MAX_ALUNOS 1000
int main()
{
  int i, indice_melhor, n;
  int turma=1;
  struct
  {
    int codigo, media;
  } alunos[MAX_ALUNOS];
  /* le numero de alunos da primeira turma */
  scanf("%d", &n);
  while (n > 0)
    {
      /* le dados dos alunos */
      for (i = 0; i < n; i++)
         scanf("%d %d", &alunos[i].codigo, &alunos[i].media);
      /* procura aluno de maior media */
      indice_melhor = 0;
      for (i = 1; i < n; i++)
         if (alunos[i].media > alunos[indice_melhor].media)
             indice_melhor = i;
      /* escreve resposta */
      printf("Turma %d\n%d\n\n", turma++, alunos[indice_melhor].codigo);
      /* le numero de alunos da proxima turma */
      scanf("%d", &n);
    }
  return 0;
}
Código em C++
#include <iostream>
const int MAX_ALUNOS = 1000;
int main()
{
  int i, indice_melhor, n;
  int turma=1;
  struct
  {
    int codigo, media;
  } alunos[MAX_ALUNOS];
  // le numero de alunos da primeira turma
  cin >> n;
  while (n > 0)
    {
      // le dados dos alunos
      for (i = 0; i < n; i++)
         cin >> alunos[i].codigo >> alunos[i].media;
      // procura aluno de maior media
      indice_melhor = 0;
      for (i = 1; i < n; i++)
         if (alunos[i].media > alunos[indice_melhor].media)
             indice_melhor = i;
      // escreve resposta
      cout << "Turma " << turma++ << "\n";
      cout << alunos[indice_melhor].codigo << "\n\n";
      // le numero de alunos da proxima turma
      cin >> n;
    }
  return 0;
}

Adicionado por:Wanderley Guimarães
Data:2006-05-05
Tempo limite:1s
Tamanho do fonte:50000B
Linguagem permitida:Todas exceto: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Origem:Olimpiada Brasileira de Informatica 2003

hide comments
2012-05-15 22:25:27 Rafael dos Anjos Menezes
fiz de duas formas diferentes, ambas funcionam perfeitamente nos testes que eu fiz (que nao foram poucos), mas continua dando "resposta errada" D:
2012-02-18 15:24:14 Denis Carvalho Silva
meu código nao foi aceito em c... mas sim em c++. Alguem sabe porque?
2010-08-16 02:11:46 thiagojobson [UERN]
Quem tá acostumado em colocar "Teste n" preste atenção que o problema pede "Turma n".
2009-09-27 18:39:49 Guilherme Souza
no codigo em c++ falta o
using namespace std;
SPOJ System © 2012 Sphere Research Labs | Projekty informatyczne i aplikacje na zamówienie. All Rights Reserved.