USP Kolokvijum I (2026)


F1 selektor

Svake sezone Formule 1, svaki tim bira po dva vozača. Napisati program koji na osnovu podataka i rezultata vozača bira najbolja dva vozača za svaki tim.

Timovi u sezoni Formule 1 su: Alpine, Aston_Martin, Ferrari, Haas_F1_Team, Kick_Sauber, McLaren, Mercedes, Racing_Bulls, Red_Bull_Racing i Williams.

Svaki vozac ima ime, tim, broj osvojenih bodova u prethodnoj sezoni, najbolje vreme kvalifikacionog kruga (u milisekundama) i status (koji može biti OK(0), SUSPENDOVAN(1) ili POVREDJEN(2)). Napisati strukturu Vozac koja sadrži ove podatke (1 poen).

Vozači se biraju na osnovu sledećih kriterijuma:

  1. Vozač mora biti podoban, što znaći da:

    • nije suspendovan (status nije SUSPENDOVAN(1));
    • nije povređen (status nije POVREDJEN(2));
    • ima najmanje 40 osvojenih bodova u prethodnoj sezoni; i
    • vozio je kvalifikacije (najbolji kvalifikacioni krug nije 0).
      Implementirati funkciju int je_podoban(const Vozac* v) koja proverava da li je vozač podoban (1 poen).
  2. Među podobnim vozačima, biraju se oni sa najboljim vremenom kvalifikacionog kruga. Ako dva vozača imaju isto vreme kvalifikacionog kruga, bira se onaj sa većim brojem osvojenih bodova u prethodnoj sezoni. Implementirati funkciju int poredjenje_vozaca(const void* a, const void* b) koja poredi dva vozača po navedenim kriterijumima (1 poen).

Glavni program treba da učita podatke o vozačima dinamički u niz, sa inicijalnom veličinom 10 koja se duplira pri svakoj realokaciji (2 poena), iz datoteke (1 poen) čija se putanja prosleđuje kao argument komandne linije (1 poen). Omogućiti izbor najboljih vozača za svaki tim (2 poena), sa ispravnom obradom grešaka (1 poen).

Ulaz

Program se pokreće komandnom linijom oblika (1 poen):

./f1_selektor <putanja_vozaca>

Tekstualna datoteka na putanji <putanja_vozaca> sadrži podatke o vozačima i njihovim rezultatima. Svaki red datoteke sadrži ime vozača (niska bez razmaka maksimalne dužine 31), tim (niska bez razmaka maksimalne dužine 31), broj osvojenih bodova u prethodnoj sezoni (ceo broj), najbolji kvalifikacioni krug u milisekundama (ceo broj) i status vozača (ceo broj koji kodira: OK(0), SUSPENDOVAN(1) i POVREDJEN(2)), odvojene razmakom.

Izlaz

Na standardni izlaz, za svaki tim, ispisati ime tima i imana dva izabrana vozača, odvojena razmakom. Timovi treba da budu ispisani redom kako su navedeni u opisu zadatka. Pretpostaviti da će u svakom timu biti bar dva vozača koja zadovoljavaju kriterijume.

U slučaju greške (neispravan broj argumenata komandne linije, nepostojanje datoteke sa vozačima ili nemogućnost čitanja iz nje), na standardni izlaz za greške ispisati -1 i završiti program sa statusom neuspeha (1).

Primer

command line

./f1_selektor vozaci.txt

vozaci.txt

Lewis_Hamilton Mercedes 250 80800 0
ance_Stroll Aston_Martin 35 82400 0
Alex_Albon Red_Bull_Racing 85 0 0
Pietro_Fittipaldi Haas_F1_Team 75 83650 0
Esteban_Ocon Alpine 165 82300 0
Oscar_Piastri McLaren 195 81600 0
Max_Verstappen Red_Bull_Racing 300 80500 0
Stoffel_Vandoorne Aston_Martin 55 0 0
Mick_Schumacher Mercedes 110 82000 0
Zhou_Guanyu Kick_Sauber 95 82900 0
Antonio_Giovinazzi Ferrari 35 0 0
Victor_Martins Alpine 45 84200 1
Yuki_Tsunoda Racing_Bulls 110 83200 0
Lando_Norris McLaren 210 81500 0
Franco_Colapinto Williams 95 83600 0
Callum_Ilott Haas_F1_Team 60 83800 2
Charles_Leclerc Ferrari 220 81000 0
Frederik_Vesti Kick_Sauber 65 0 0
Daniel_Ricciardo Racing_Bulls 140 83000 0
Theo_Pourchaire Alpine 60 0 0
Jack_Doohan McLaren 90 82800 2
Logan_Sargeant Williams 65 83800 0
Kevin_Magnussen Haas_F1_Team 120 83500 0
Daniel_Kvyat Red_Bull_Racing 100 81400 0
Fernando_Alonso Aston_Martin 200 82000 0
Carlos_Sainz Ferrari 210 81200 0
Alex_Palou McLaren 120 82000 0
Nyck_DeVries Mercedes 65 0 0
Theo_Nakamura Kick_Sauber 30 84000 1
Pierre_Gasly Alpine 150 82500 0
Ayumu_Iwasa Racing_Bulls 45 84200 2
Antonio_Fuoco Ferrari 50 83800 1
Jamie_Chadwick Williams 55 85000 2
Nico_Hulkenberg Haas_F1_Team 130 83300 0
George_Russell Mercedes 230 80900 0
Felipe_Drugovich Aston_Martin 70 82800 0
Robert_Schwartzman Kick_Sauber 75 83100 0
Nikita_Mazepin Aston_Martin 20 83500 2
Valtteri_Bottas Kick_Sauber 180 82600 0
Oliver_Bearman Ferrari 85 82000 0
Esteban_Gutierrez Mercedes 40 84500 1
Liam_Lawson Racing_Bulls 90 83500 0
Juri_Vips Red_Bull_Racing 50 84500 1
Patricio_Oward McLaren 85 0 0
Isack_Hadjar Racing_Bulls 55 0 0
Nicholas_Latifi Williams 80 84200 0
Ryo_Hirakawa Haas_F1_Team 25 0 0
Jack_Aitken Alpine 90 84000 0
Sergio_Perez Red_Bull_Racing 190 80600 0
Roy_Nissany Williams 35 0 0

stdout

Alpine Esteban_Ocon Pierre_Gasly
Aston_Martin Fernando_Alonso Felipe_Drugovich
Ferrari Charles_Leclerc Carlos_Sainz
Haas_F1_Team Nico_Hulkenberg Kevin_Magnussen
Kick_Sauber Valtteri_Bottas Zhou_Guanyu
McLaren Lando_Norris Oscar_Piastri
Mercedes Lewis_Hamilton George_Russell
Racing_Bulls Daniel_Ricciardo Yuki_Tsunoda
Red_Bull_Racing Max_Verstappen Sergio_Perez
Williams Franco_Colapinto Logan_Sargeant

Primer

command line

./f1_selektor vozaci2.txt

stderr

-1

Primer

command line

./f1_selektor

stderr

-1

F1 prenos

Miki sluša radio prenos trke Formule 1. On na početku trke poseduje startnu listu vozača označenih svojim startnim brojevima. Kako bi mogao da isprati poredak trke, potreban mu je program koji će podržati sledeće funkcionalnosti:

Nakon izvršenja svih upita, ispisati poredak takmičara. Podrazumevati da se pozicije broje od $1$.

Napomena: zadatak se mora uraditi korišćenjem listi, inače nosi $0$ poena.

Ulaz

Sa standardnog ulaza se najpre učitava lista pozitivnih celih brojeva (startna lista vozača). Nakon toga, učitava se broj upita $n$ ($1 \le n \le 100$), a zatim i $n$ upita u ranije opisanom formatu.

Izlaz

Na standardni izlaz ispisati poredak vozača nakon izvršenih svih $n$ upita. U slučaju greške, na standardni izlaz za greške ispisati -1 i prekinuti program sa izlaznim kodom neuspeha (1).

Primer

stdin

[1, 2, 3, 4, 5]
6
up 2
ip 2 4
pp 2 5
pp 4 2
du 5 4
du 2 5

stdout

[1, 4, 2, 5, 3]

Objašnjenje

Stanje liste nakon svakog upita:

Primer

stdin

[1, 2, 3, 4, 5]
6
up 2
ip 2 4
pp 2 6
pp 4 2
du 1 2
du 5 2

stderr

-1

Objašnjenje

Stanje liste nakon svakog upita:

Primer

stdin

[1, 2, 3, 4, 5]
7
up 2
ip 2 4
pp 2 5
pp 4 2
du 1 3
du 5 2        

stderr

-1

Objašnjenje

Stanje liste nakon svakog upita: