Smučarji

Smučarji

Avtor: Tjaša Dragar

Navodilo naloge

Naloga: 2003.3.2-Smučarji

Celotna pola iz tekmovanja je dosegljiva na:

Tekmovanje 2003

Na posamezni smučarski tekmi za svetovni pokal dobi vsak tekmovalec določeno število točk (0 ali več). Število prejetih točk je odvisno od njegove uvrstitve na tej tekmi. Mednarodna smučarska zveza vodi tudi razvrstitev v skupnem seštevku, kjer je vsak tekmovalec predstavljen z vsoto točk, ki jih je dobil na vseh tekmah trenutne sezone. Ko manjka do konca sezone le še ena tekma, se opazovalci radi sprašujejo, katera je najslabša ali najboljša možna uvrstitev v skupnem seštevku, ki bi jo nek tekmovalec utegnil dobiti po zadnji tekmi. Recimo na primer, da se na posamezni tekmi dobi 100 točk za prvo mesto, 50 za drugo, 25 za tretje, za ostala pa še manj. Recimo še, da v skupnem seštevku trenutno vodi tekmovalec A, drugo uvrščeni pa je tekmovalec B, ki za A-jem zaostaja za 60 točk. Iz tega že lahko sklepamo, da bo A po zadnji tekmi v skupnem seštevku ali prvi ali drugi, gotovo pa ne slabši. Da bi ga kdo v skupnem seštevku prehitel, bi namreč potreboval vsaj 60 točk, toliko pa lahko na eni tekmi dobi samo zmagovalec. Torej lahko A-ja v skupnem seštevku prehiti največ en tekmovalec (zmagovalec zadnje tekme, če se A na njej uvrsti dovolj slabo). Tvoj program bo v vhodni datoteki dobil naslednje podatke. (Vsi podatki so cela števila, vsako je v samostojni vrstici, okoli njih ni presledkov, praznih vrstic ali česa podobnega.)

  • V prvi vrstici je m, število smučarjev, ki na posamezni tekmi dobijo kaj točk. Tisti, ki se uvrstijo na (m + 1)-vo ali slabše mesto, ne dobijo nič točk.
  • V naslednjih m vrsticah je za vsako uvrstitev od prve do m-te podano število točk, ki jih dobi tekmovalec za to uvrstitev. Če število točk, ki jih prejme i-to uvrščeni, označimo s ti, lahko predpostaviš, da velja: 100 000 ≥ t_1 > t_2 > t_3 > • • • > t_m−1 > t_m > 0.
  • V naslednji vrstici je n, število smučarjev v skupnem seštevku svetovnega pokala.
  • V naslednjih n vrsticah je podano za vsakega od teh smučarjev njegovo število točk v skupnem seštevku pred zadnjo tekmo sezone; najprej za vodilnega v skupnem seˇstevku, nato za drugega, itd., nazadnje pa za zadnjega. Če je ai število točk, ki jih ima i-ti najboljši v skupnem seštevku, lahko predpostaviš, da velja: 100 000≥a_1≥a_2≥a_3 • • •≥a_n−≥ a_n ≥0.

Tako m kot n sta pozitivni celi števili, ki nista manjši od 1 in nista večji od 3 000. V izhodno datoteko naj tvoj program zapiše n vrstic. V vsaki naj bosta dve pozitivni celi števili. Prvo število v i-ti vrstici naj bo najboljši možni položaj, ki ga bi utegnil imeti v skupnem seštevku po zadnji tekmi tisti tekmovalec, ki je v skupnem seštevku pred zadnjo tekmo na i-tem mestu. Drugo število v i-ti vrstici naj bo najslabši možni položaj, ki bi ga utegnil imeti ta tekmovalec v skupnem seštevku po zadnji tekmi. Dogovorimo se še, da na zadnji tekmi sezone velja posebno pravilo: ne more se zgoditi, da bi si dva ali več tekmovalcev delilo isto mesto (torej tudi ne morejo dobiti enakega števila točk). Če bi imelo več tekmovalcev na stotinko enak čas, jih bodo pač razvrstili s pomočjo žreba in zakulisne kuhinje. (Lahko pa si več ljudi deli mesto v skupnem seštevku. Če sta dva sedma, je tisti takoj za njima deveti in podobno.) Mogoče pa je, da kak tekmovalec (lahko celo zelo veliko tekmovalcev) med tekmo odstopi (ali pa sploh ne štartajo ali pa so diskvalificirani) in takšni ne dobijo na tej tekmi nobenih točk.

Primer vhodne datoteke:

6

50

25

20

10

5

3

10

1000

980

971

930

925

923

920

915

912

910

Pripadajoča izhodna datoteka:

1 3

1 3

1 4

2 8

3 10

3 10

4 10

4 10

4 10

4 10

Opis problema

Na vhodni datoteki dobimo podatke o številu tekmovalcev za svetovni pokal, o skupnem seštevku točk za vsakega tekmovalca pred zadnjo tekmo ter o številu in vrednostih možnih točk na zadnji tekmi(točke na posamezni tekmi dobi le prvih nekaj mest). Te vrednosti bo potrebno prebrati iz datoteke in za vsakega tekmovalca posebej izračunati njegov najboljši in najslabši možni izid po zadnji tekmi.

Ideja rešitve

Glede na to, da vhodna datoteka vsebuje samo neka cela števila, bomo morali najprej ustrezno izluščiti podatke, ki jih bomo potrebovali za računanje najboljših in najslabših možnih izidov tekmovalcev. Vhodna datoteka razčlenjena po vrsticah zgleda nekako takole:

(datoteka.png)

Ko bomo imeli te podatke bomo lahko reševali naprej. Najprej bomo poiskali najboljši možni izid za vse tekmovalce. Pri tem bomo upoštevali, da je možno , da kak(lahko tudi vsi) igralec na zadnji tekmi odstopi/je diskvalificiran in s tem ne dobi nič točk. Najboljši možni izid tekmovalca A bomo torej dobili tako, da bomo skupnemu seštevku točk tekmovalca A prišteli največjo vrednost točk, ki jo lahko doseže na zadnji tekmi(kar pomeni, da vzamemo primer ko igralec A na zadnji tekmi zmaga), vsem ostalim pa točk ne bomo spreminjali(je bila njihova uvrstitev zelo slaba ali pa so odstopili) in pogledali kakšen bi bil v tem primeru njegov rezultat v skupnem seštevku po zadnji tekmi. Najslabši možni izid pa bomo dobili nekoliko drugače. Najprej ugotovimo, da izid igralca A, ki je bil pred zadnjo tekmo na i-tem mestu, lahko poslabšajo le igralci, ki so skupno za njim (na vsaj i+1.-em mestu), in sicer tako, da ga s točkami doseženimi na zadnji tekmi prehitijo v skupnem seštevku. Recimo, da imamo v neki tabeli točke shranjene možne točke na zadnji tekmi. Najslabši možni izzid tekmovalca A bomo dobili tako, da njegovih točk v skupnem seštevku ne bomo spreminjali, za vsakega igralca za njim pa bomo pogledali kakšno je najmanjše možno število točk na zadnji tekmi(možne so le vrednosti v tabeli točke), s katerimi bi prehitel tekmovalca A in mu te točke tudi dodelili. Na koncu pa bomo le pogledali koliko tekmovalcev je »prehitelo« tekmvalca A in s tem dobili njegov najslabši možni izid. Upoštevamo še, da na zadnji tekmi 2 ali več tekmovalcev ne more dobiti enako števil točk. Ko bomo dobili najboljše in najslabše možne izide za vseh n tekmovalcev, bomo rešitve v ustrezni obliki morali zapisati še na izhodno datoteko. V izhodno datoteko bomo zapisali n vrstic. V vsaki vrstici bosta 2 pozitivni celi števili. Če pogledamo i-to vrstico bo 1. element v i-ti vrstici predstavljal najboljši možni izid, ki bi ga lahko po zadnji tekmi imel i-ti tekmovalec(to je tekmovalec, ki je bil pred zadnjo tekmo v skupnem seštevku na i-tem mestu oz. je bil v vhodni datoteki v (i+1). vrstici). Drugi element v i-ti vrstici pa bo najslabši možni položaj za istega igralca po zadnji tekmi.

Razlaga algoritma

Koda programa se nahaja v spodnji datoteki:

Smučarji

Razlaga algoritma se nahaja kar v datoteki smucarji.py (kot komentarji kode), saj se mi je zdelo lažje komentirati sproti/poleg kode.

Razlaga testnih primerov

Priložena je datoteka vhodna.txt, na kateri se nahajajo podatki o smučarjih. Program sem stestirala na tej datoteki in dobila pravilne rezultate(na datoteki izhodna.txt).

Datoteki sta dosegljivi:

Vhodna datoteka

Pripadajoča izhodna datoteka

Testiranje je prikazano tudi v spodnjem filmčku:

0%
0%