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:

  1. Ordenar o vetor

  2. 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