Hakathon rang lista
Organizatori studentskog hakathona žele da prikažu rang listu timova sortiranu po tipičnim ACM pravilima. Napisati program koji koristeći qsort sortira sve timove prema sledećim kriterijumima:
- Veći broj rešenih zadataka dolazi pre manjeg broja.
- Ako dva tima imaju isti broj rešenih zadataka, pre dolazi tim sa manjim kaznenim poenima.
- Ako su i broj zadataka i kazneni poeni isti, tada se leksikografski upoređuje po nazivu.
Ulaz
Sa standardnog ulaza se najpre učitava ceo broj <name> <solved> <penalty>, gde je:
-
<nema>jedna reč (bez razmaka) dužine najviše$32$ karaktera, -
<solved>ceo broj iz opsega$[0, 50]$ , -
<penalty>ceo broj iz opsega$[0, 100000]$ .
Izlaz
Na standardni izlaz ispisati sortiranu rang listu, po jedan tim u redu, u formatu <name> <solved> <penalty>.
Primer
Ulaz
5
LukaCode 4 590
ByteBros 5 720
Trojac 4 500
Ananas 5 720
Kafein 4 500
Izlaz
Ananas 5 720
ByteBros 5 720
Kafein 4 500
Trojac 4 500
LukaCode 4 590
Rešenje
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 32
typedef struct {
char name[MAX_NAME_LEN + 1];
int solved;
int penalty;
} Team;
static int cmp_team(const void *lhs, const void *rhs)
{
const Team *a = lhs;
const Team *b = rhs;
if (a->solved != b->solved) {
return b->solved - a->solved;
}
if (a->penalty != b->penalty) {
return a->penalty - b->penalty;
}
return strcmp(a->name, b->name);
}
int main(void)
{
size_t n;
scanf("%zu", &n);
Team *teams = malloc(n * sizeof *teams);
if (teams == NULL) {
exit(EXIT_FAILURE);
}
for (size_t i = 0; i < n; i++) {
scanf("%32s %d %d", teams[i].name, &teams[i].solved, &teams[i].penalty);
}
qsort(teams, n, sizeof (Team), cmp_team);
for (size_t i = 0; i < n; i++) {
printf("%s %d %d\n", teams[i].name, teams[i].solved, teams[i].penalty);
}
free(teams);
exit(EXIT_SUCCESS);
}