2381 - Lista de Chamada
Um problema bastante tranquilo com várias formas diferenciadas de se resolver, testando sua criatividade e conhecimento de estruturas de linguagem.
Descrição
Solução
Este problema se resume a encontrar o k-ésimo menor elemento em um vetor, onde o k é dado pelo enunciado. Para este problema em específico temos algumas soluções viáveis com suas respectivas complexidades, mas por questão de simplicidade, aqui só vou colocar a mais simples. Mas só à caráter expositivo, as soluções mais eficientes envolvem heaps e até mesmo um algoritmo linear chamado QuickSelect.
Mas, bem, a solução mais simples é ordenar o vetor e escolher o k-ésimo elemento.
Complexidades
Termo assintótico
Tempo
O(n log n) para a ordenação
Espaço adicional
O(1)
Normalmente essa é a primeira maneira que a gente pensa para resolver o problema. São duas simples etapas:
Ordenar o vetor
Retornar o k-ésimo elemento do vetor ordenado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int comp(const void* a, const void* b){
return strcmp((char*)a,(char*)b);
}
int main(void) {
int K, N, i;
char alunos[200][50];
scanf("%d %d\n", &N, &K);
for(i = 0; i < N; ++i){
scanf("%s", &alunos[i]);
}
qsort(alunos, N, sizeof(char) * 50, comp);
printf("%s\n", alunos[K - 1]);
return 0;
}
Last updated
Was this helpful?