Guide for Llistat d'alumnes
Com abordar aquest problema
Se't donen les notes de N alumnes (nom, nota del primer parcial i nota del segon parcial), i has \ de trobar dos alumnes concrets: un segons la seva posició ordenant pel segon parcial, i un altre \ segons la seva posició ordenant per la nota final.
Idea general:
- Llegeix N i després les N línies, guardant per a cada alumne el seu nom i les dues notes.
- Calcula la nota final de cada alumne (un 40% de la nota del primer parcial i un 60% de la \ del segon parcial).
- Llegeix els dos números P1 i P2 del final de l'entrada.
- Ordena una còpia de la llista d'alumnes pel segon parcial, de més gran a més petit, i queda't \ amb l'alumne que ocupa la posició P1.
- Ordena (una altra còpia de) la llista pel la nota final, de més gran a més petit, i queda't amb \ l'alumne que ocupa la posició P2.
- Escriu les dues línies de sortida amb el format demanat (nom, parcial1, parcial2, nota final).
Paranys habituals:
- Les posicions P1 i P2 són 1-indexades (la posició 1 és la primera), mentre que els índexs de \ llistes en programació solen començar a 0.
- Cal ordenar l'alumne sencer (nom + notes juntes), no cada columna per separat, si no perdràs la \ relació entre el nom i les seves notes.
- Compte amb el format de sortida dels decimals de la nota final.
Pista per a Java
Defineix una petita classe Alumne amb el nom i les notes, guarda'ls en un ArrayList<Alumne>, i \
ordena'l dues vegades amb Collections.sort fent servir un Comparator diferent cada vegada:
import java.util.*;
public class Main {
static class Alumne {
String nom;
double p1, p2, nota_final;
Alumne(String nom, double p1, double p2) {
this.nom = nom;
this.p1 = p1;
this.p2 = p2;
this.nota_final = 0.4 * p1 + 0.6 * p2;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine().trim());
List<Alumne> alumnes = new ArrayList<>();
for (int i = 0; i < n; i++) {
String[] dades = sc.nextLine().trim().split("\\s+");
alumnes.add(new Alumne(dades[0], Double.parseDouble(dades[1]), Double.parseDouble(dades[2])));
}
int pos1 = sc.nextInt();
int pos2 = sc.nextInt();
List<Alumne> perSegonParcial = new ArrayList<>(alumnes);
perSegonParcial.sort((a, b) -> Double.compare(b.p2, a.p2));
List<Alumne> perNotaFinal = new ArrayList<>(alumnes);
perNotaFinal.sort((a, b) -> Double.compare(b.nota_final, a.nota_final));
Alumne a1 = perSegonParcial.get(pos1 - 1);
Alumne a2 = perNotaFinal.get(pos2 - 1);
System.out.printf("%s %s %s %.2f%n", a1.nom, a1.p1, a1.p2, a1.nota_final);
System.out.printf("%s %s %s %.2f%n", a2.nom, a2.p1, a2.p2, a2.nota_final);
}
}