Problema de Ordenamiento Simulando Excel
Excel permite ordenar rgeistros según cualquier columna. En este ejercicio, se debe implementar una función similar que ordene una lista de estudiantes basándose en una columna designada, con criterios de desempate específicos.
Especificación de Entrada
Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea incluye dos números enteros N (≤ 100000) y C, donde N indica la cantidad de registros y C determina la columna para el ordenamiento. Las siguientes N líneas contienen los datos de cada estudiante: un ID único de 6 dígitos, un nombre (sin espacios, máximo 8 caracteres) y una calificación (entero entre 0 y 100).
Esepcificación de Salida
Se debe imprimir el resultado del ordenamiento en N líneas. Si C es 1, se ordena por ID de forma ascendente; si C es 2, se ordena por nombre de forma no decreciente; si C es 3, se ordena por calificación de forma no decreciente. En caso de empate en nombre o calificación, se desempata por ID ascendente.
Ejemplo de Entrada 1
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
Ejemplo de Salida 1
000001 Zoe 60
000007 James 85
000010 Amy 90
Ejemplo de Antrada 2
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
Ejemplo de Salida 2
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Ejemplo de Entrada 3
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
Ejemplo de Salida 3
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
Análisis y Solución
Este problema es un ejercicio clásico de ordenamiento. Es crucial evitar usar cin y cout para la E/S en C++, ya que pueden causar tiempos de ejecución excesivos en grandes volúmenes de datos. En su lugar, se recomienda emplear funciones más rápidas como scanf y printf. La estrategia consiste en almacenar los registros en una estructura adecuada y aplicar un algoritmo de ordenamiento con un comparador personalizado que respete los criterios de la columna seleccionada y el desempate por ID.
A continuación se presenta una implementación en C++ optimizada:
#include<cstdio>
#include<cstring>
#include<algorithm>
struct Registro {
char id[7];
char nombre[9];
int nota;
};
int criterio;
bool comparar(const Registro &a, const Registro &b) {
if (criterio == 1) {
return strcmp(a.id, b.id) < 0;
} else if (criterio == 2) {
int cmp = strcmp(a.nombre, b.nombre);
return (cmp != 0) ? cmp < 0 : strcmp(a.id, b.id) < 0;
} else {
if (a.nota != b.nota) return a.nota < b.nota;
return strcmp(a.id, b.id) < 0;
}
}
int main() {
int n;
scanf("%d %d", &n, &criterio);
Registro estudiantes[100000];
for (int i = 0; i < n; ++i) {
scanf("%s %s %d", estudiantes[i].id, estudiantes[i].nombre, &estudiantes[i].nota);
}
std::sort(estudiantes, estudiantes + n, comparar);
for (int i = 0; i < n; ++i) {
printf("%s %s %d\n", estudiantes[i].id, estudiantes[i].nombre, estudiantes[i].nota);
}
return 0;
}
Este código utiliza un arreglo de estructuras en lugar de vectores anidados, cambia los nombres de variables y la función de comparación, y emplea scanf y printf para una E/S más eficiente. La lógica de ordenamiento se mantiene correcta para los casos descritos.