Test sistemi#4416

Test sistemi (Həll təhlili)

Komandanı struktur şəklində təqdim edəcəyik və bu sahələri əhatə edəcəkdir:

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 = ' ')