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:

  1. Veći broj rešenih zadataka dolazi pre manjeg broja.
  2. Ako dva tima imaju isti broj rešenih zadataka, pre dolazi tim sa manjim kaznenim poenima.
  3. 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 $n$ ($1 \leq n \leq 10^6$). Zatim sledi $n$ linija, svaka u formatu <name> <solved> <penalty>, gde je:

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);
}