Komandanı struktur şəklində təqdim edəcəyik və bu sahələri əhatə edəcəkdir:
komanda nömrəsi;
cəza vaxtı;
həll edilmiş məsələlərin sayı;
Problemi həll etmək üçün ICPC qaydalarına uyğun olaraq iki komandanı müqayisə edən bir komparator — müqayisə funksiyasını həyata keçirməli və sonra sıralama etməliyik.
Alqoritmin həyata keçirilməsi
Komandanın strukturunu elan edəcəyik — ICPC yarış iştirakçısı, bu strukturda komanda nömrəsi, cəza vaxtı və həll edilmiş məsələlərin sayı var.
struct person
{
int id, penalty_time, problems;
} *acm;cmp funksiyasını — yarış iştirakçılarının sıralaması üçün komparatoru reallaşdıracağıq.
int cmp(person a, person b)
{Həll edilmiş məsələlər sayına görə azalan sırayla sıralayırıq.
if (a.problems != b.problems) return a.problems > b.problems;Həll edilmiş məsələlərin sayı bərabər olduqda — cəza vaxtına görə artan sırayla sıralayırıq.
if (a.penalty_time != b.penalty_time)
return a.penalty_time < b.penalty_time;Digər hallarda — komanda nömrəsinə görə artan sırayla sıralayırıq.
return a.id < b.id;
}Proqramın əsas hissəsi. Komandalar üçün yaddaş ayırırıq.
scanf("%d",&n);
acm = new person[n];Komandaların məlumatlarını oxuyuruq.
for (i = 0; i < n; i++)
{
scanf("%d %d",&acm[i].problems,&acm[i].penalty_time);
acm[i].id = i + 1;
}Komandaları verilmiş şərtlərə uyğun olaraq sıralayırıq.
sort(acm, acm+n, cmp);Komanda nömrələrini cədvəl nəticəsinə uyğun olaraq göstəririk.
for (i = 0; i < n; i++)
printf("%d", acm[i].id);
printf("\n");
delete[] acm;Alqoritmin həyata keçirilməsi — vektor
Komandanın strukturunu elan edəcəyik — ICPC yarış iştirakçısı, bu strukturda komanda nömrəsi, cəza vaxtı və həll edilmiş məsələlərin sayı var.
struct person
{
int id, penalty_time, problems;
};komandalar array'ini elan edəcəyik.
vector<person> acm;cmp funksiyasını — yarış iştirakçılarının sıralaması üçün komparatoru reallaşdıracağıq.
int cmp(person a, person b)
{Həll edilmiş məsələlər sayına görə azalan sırayla sıralayırıq.
if (a.problems != b.problems) return a.problems > b.problems;Həll edilmiş məsələlərin sayı bərabər olduqda — cəza vaxtına görə artan sırayla sıralayırıq.
if (a.penalty_time != b.penalty_time)
return a.penalty_time < b.penalty_time;Digər hallarda — komanda nömrəsinə görə artan sırayla sıralayırıq.
return a.id < b.id;
}Proqramın əsas hissəsi. Giriş məlumatlarını oxuyuruq.
scanf("%d",&n);
acm.resize(n);
for (i = 0; i < n; i++)
{
scanf("%d %d",&acm[i].problems,&acm[i].penalty_time);
acm[i].id = i + 1;
}Komandaları verilmiş şərtlərə uyğun olaraq sıralayırıq.
sort(acm.begin(), acm.end(), cmp);Komanda nömrələrini cədvəl nəticəsinə uyğun olaraq göstəririk.
for (i = 0; i < n; i++)
printf("%d ", acm[i].id);
printf("\n");Alqoritmin həyata keçirilməsi — daxili komparator
#include <cstdio>
#include <algorithm>
using namespace std;
int n, i, ptr;
struct person
{
int id, penalty_time, problems;
int operator< (const person &a) const
{
if (problems != a.problems) return problems > a.problems;
if (penalty_time != a.penalty_time)
return penalty_time < a.penalty_time;
return id < a.id;
}
} *acm;
int main(void)
{
scanf("%d",&n);
acm = new person[n];
for (i = 0; i < n; i++)
{
scanf("%d %d",&acm[i].problems,&acm[i].penalty_time);
acm[i].id = i + 1;
}
sort(acm, acm+n);
for (i = 0; i < n; i++)
printf("%d ", acm[i].id);
printf("\n");
delete[] acm;
return 0;
}Java həyata keçirilməsi
import java.util.*;
class Person
{
int problems;
int penalty_time;
int id;
public Person(int problems, int penalty_time, int id)
{
this.problems = problems;
this.penalty_time = penalty_time;
this.id = id;
}
}
public class Main
{
public static class MyFun implements Comparator<Person>
{
public int compare(Person a, Person b)
{
if (a.problems == b.problems && a.penalty_time == b.penalty_time) return a.id - b.id;
if (a.problems == b.problems) return a.penalty_time - b.penalty_time;
return b.problems - a.problems;
}
}
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
Person[] p = new Person[n];
for (int i = 0; i < n; i++)
p[i] = new Person(con.nextInt(), con.nextInt(), i+1);
Arrays.sort(p, new MyFun());
for (int i = 0; i < n; i++)
System.out.print(p[i].id + " ");
con.close();
}
}Python həyata keçirilməsi
Komandaların sayını oxuyuruq.
n = int(input())komandalarının siyahısını qururuq. Hər komanda bu quruluşa malik bir türdə təqdim edilir
(həll edilmiş məsələlərin sayı, cəza dəqiqələr toplamı, komanda nömrəsi)
teams = []
for id in range(1, n + 1):
problems, penalty_times = map(int, input().split())
teams.append((problems, penalty_times, id))Komandaları verilmiş şərtlərə uyğun olaraq sıralayırıq.
teams.sort(key = lambda team: (-team[0], team[1], team[2]))Komanda nömrələrini cədvəl nəticəsinə uyğun olaraq göstəriş veririk.
for t in teams:
print(t[2], end = ' ')