Logo Hardware.com.br
J.B.P.
J.B.P. Novo Membro Registrado
9 Mensagens 0 Curtidas

(Questão da Olimpíada Brasileira de Informática)

#1 Por J.B.P. 14/05/2015 - 13:43
Frequência na aula

Certa vez, numa aula, a professora passou um filme para os alunos assistirem. Durante este filme, ela passou uma lista de presença em sua sala para verificar a presença dos alunos, onde cada aluno deveria inserir apenas seu número de registro. Alguns alunos contudo, como possuem amigos que fogem da aula, decidiram ser camaradas e inseriram os números de registro de seus amigos fujões. O problema é que muitos alunos são amigos de alunos que fogem da aula e alguns números de registro acabaram sendo repetidamente inseridos na lista de presença. Além de tudo, alguns dos alunos que se esperava que não estivessem na aula de fato estavam!

A professora, ao notar que a lista de presença continha alguns números repetidos, ficou sem entender, mas decidiu dar um voto de confiança e dar presença a todos os alunos cujos números de registro estavam na lista. Como são muitos alunos na sala e muitos números com repetição, ela pediu a sua ajuda para determinar o total de alunos que receberam presença na aula.

Entrada
A primeira linha da entrada contém um número inteiro N , que informa a quantidade de números de registro que apareceram na lista de presença. Cada uma das N linhas seguintes contém um número de registro Vi que foi inserido na lista de presença.

Saída
Seu programa deve imprimir uma única linha, contendo apenas um número inteiro, o número de alunos que receberam presença.

Restrições

  • 1 ≤ N ≤ 10^5

  • Para cada elemento Vi, 0 ≤ Vi ≤ 10^6


Informações sobre a pontuação

  • Em um conjunto de casos que totaliza 40 pontos, N ≤ 10^3 e Vi ≤ 10^3


Exemplos

Entrada ..............................................Saída
3 ........................................... 3
2
3
1

Entrada........................................... Saída
7 ........................................... 5
0
5
12
41
7
5
41

Se preferirem, olha o link da questão: http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/2012f1p2_frequencia
Abaixo vem a solução disponibilizada pela coordenação da OBI:
[code=C]
#include

int freq[1123456];

int main() {
int i, n, x, res = 0;
scanf("%d", &n);
for (i = 0; i < n; ++i) {
scanf("%d", &x);
if (freq[x] == 0) {
freq[x] = 1;
res += 1;
}
}
printf("%d\n", res);
return 0;
}
[/code]

Agora, eu não entendi porque criar um vetor de 1123456 posições, sendo que o vetor corresponde a quantidade alunos e a quantidade máxima é 10^5, que é igual a 100.000 alunos. Eu até tentei colocar 100000, mas só valida 40% dos casos de testes. Resultando em 40 pontos de 100.
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#2 Por tpcvasco
14/05/2015 - 16:32
Nas restrições é definido q Vi pode ir de 0 a 10^6
Ou seja, apesar do número de alunos poder ir só até 100.000, o maior registro possível pode ir até 1.000.000. Então o vetor "freq" tem q ter pelo menos 1 milhão de posições. os 123456 restantes eu não sei o motivo, talvez seja só "charme" rs
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#4 Por esquiloesper...
15/05/2015 - 07:20
É o tipo de "charme" que pode custar um enorme "zero" para a resposta, já que a restrição reza [ Vi <= 10^6 ]. Óbvio que qualquer coisa acima de um milhão constitui erro de programação, por não atender aos requisitos funcionais, e no código de exemplo não existe nada invalidando isso.

E este não é o único erro do código, porque ele sequer atende ao que foi pedido na saída de dados. Observe:

"Seu programa deve imprimir uma única linha, contendo apenas um número inteiro, o número de alunos que receberam presença"


Ora, se havia entradas repetidas também é óbvio que o "número de registros" não vai bater com o número de alunos. - Agora observem que o contador interno dentro do loop incrementa "res" a cada registro inserido na lista. - Tsss... tsss... tsss...
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
J.B.P.
J.B.P. Novo Membro Registrado
9 Mensagens 0 Curtidas
#5 Por J.B.P.
15/05/2015 - 09:48
Eu estava pensando, nas restrições diz que
esquiloesperto disse:
É o tipo de "charme" que pode custar um enorme "zero" para a resposta, já que a restrição reza [ Vi <= 10^6 ]. Óbvio que qualquer coisa acima de um milhão constitui erro de programação, por não atender aos requisitos funcionais, e no código de exemplo não existe nada invalidando isso.

E este não é o único erro do código, porque ele sequer atende ao que foi pedido na saída de dados. Observe:

"Seu programa deve imprimir uma única linha, contendo apenas um número inteiro, o número de alunos que receberam presença"


Ora, se havia entradas repetidas também é óbvio que o "número de registros" não vai bater com o número de alunos. - Agora observem que o contador interno dentro do loop incrementa "res" a cada registro inserido na lista. - Tsss... tsss... tsss...

Eu fiz testes com valores pequenos e deu tudo certo, também não posso testar com valores grandes já que alguns exemplos tem mais de 80000 linhas de entradas. E a saída é o que está dentro de res, que a quantidade de alunos sem repetições de números.
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#6 Por tpcvasco
15/05/2015 - 13:52
esquiloesperto disse:

Ora, se havia entradas repetidas também é óbvio que o "número de registros" não vai bater com o número de alunos. - Agora observem que o contador interno dentro do loop incrementa "res" a cada registro inserido na lista. - Tsss... tsss... tsss...


Não entendi onde vc está vendo erro no código em relação ao incremento do res. Ele só incrementa qdo "if (freq[x] == 0)", oq procede. Não vejo erro algum aí.
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal