došašće++
Djedičina ruta

Dostava poklona Djeda Mraza

Božić je jako blizu pa se djedica priprema za svoju misiju dostave poklona. Ove godine ima cijelu flotu saonica koje će mu pomoći u dostavi darova dobroj djeci diljem grada.

Svake saonice imaju određeni kapacitet i potrošnju goriva (hrana za sobove zapravo, ali koristimo gorivo da bude jednostavnije :D). Svako odredište ima popis željenih poklona. Budući da je inflacija u velikom porastu, djedica želi smanjiti ukupne troškove i istovremeno zadržati sve sretnima. Tvoj zadatak je pomoći mu optimizirati plan dostave odabirom pravih ruta za njegove saonice.

Djedičina baza se nalazi u ishodištu 2D koordinatnog sustava, a svako odredište je definirano svojim koordinatama (X, Y) i popisom željenih poklona. Djedica kod sebe ima beskonačnu količinu poklona svakog tipa koje će rasporediti na saonice tako da minimizira potrošnju goriva. Nije moguće prebacivanje poklona s jednih saonica na druge tijekom dostave poklona.

Ulazni podaci

  1. red: broj poklona N
  2. red: N prirodnih brojeva odvojenih razmakom, gdje i-ti broj predstavljaja težinu i-tog poklona (i = 1, 2, ..., N)
  3. red: broj saonica M
  4. red: M prirodnih brojeva odvojenih razmakom, gdje i-ti broj predstavljaja kapacitet i-tih saonica (i = 1, 2, ..., M)
  5. red: M prirodnih brojeva odvojenih razmakom, gdje i-ti broj predstavljaja potrošnju goriva i-tih saonica (i = 1, 2, ..., M)
  6. red: broj odredišta K

Idućih K redova sadrži:

Pokloni, saonice i odredišta su indeksirani počevši od 1.

Izlazni podaci

M redova koji predstavaljaju rute saonica. U prvom redu nalazi se opis rute prvih saonice, u drugom redu za druge saonice itd.

Rutu za jedne saonice opisujemo nizom podataka razdvojenih razmakom. Svaki dio podataka sastoji se od indeksa odredišta te liste poklona koju na tom odredištu ostavljaju te saonice. Oznaka odredišta i pokloni odvojeni su vertikalnom crtom (|), a lista je opisana mapom (tip:količina) kao i u ulaznim podacima.

Ako pojedine saonice ne upotrebljujemo koristimo oznaku minus (-). Nije potrebno koristiti sve saonice.

Bodovanje

Bodovanje se sastoji od dva dijela:

Ukupan broj bodova je u rasponu [0, 100 000].

Ukupan rezultat računa se kao zbroj bodova iz oba dijela.

Ukupna učinkovitost dostave (70% bodova)

Ukupna učinkovitost mjeri koliko je djedica uspješno dostavio sve poklone uz što manju potrošnju goriva.

Za svake saonice računa se njihov trošak dostave:

trošak_saonica(i) = prijeđena_udaljenost(i) × potrošnja_goriva(i)

Ukupna potrošnja goriva definira se kao:

ukupna_potrošnja = suma(trošak_saonica(i)) za i = 1, ..., M

Bodovi za ovaj dio računaju se pomoću sljedeće funkcije:

bodovi = 70 000 / (1 + ukupna_potrošnja / S)

gdje je S = 40 000 (konstanta skale dobivena iz ulaznih podataka korištenjem harmonijske sredine potrošnje goriva saonica).

Najmanje prosječno opterećenje saonica (30% bodova)

Ovaj dio bodovanja kažnjava rješenja u kojima su pojedine saonice preopterećene, dok druge nisu učinkovito iskorištene.

Za svake saonice računa se njihovo opterećenje:

opterećenje_saonica(i) = teret_saonica(i) / kapacitet_saonica(i)

Zatim uzimamo raspon najvećeg i najmanjeg opterećenja svih saonica:

raspon = max_opterećenje − min_opterećenje

Bodovi za ovaj dio:

bodovi = (1 − raspon)² × 30 000

Napomena:

Primjer

Ulaz

Razmotrimo pojednostavljeni primjer s 2 poklona, 3 saonice i 4 odredišta:

2                       # Broj poklona
2 5                     # Teret pojedinog poklona
3                       # Broj saonica
40 30 100               # Kapaciteti saonica
5 3 150                 # Potrošnja goriva po jedinici udaljenosti
4                       # Broj odredišta
0.50 0.20|1:1,2:2       # Odredište 1: Koordinate | Željeni pokloni (Tip poklona:Količina)
-0.30 0.80|1:1,2:1      # Odredište 2: Koordinate | Željeni pokloni (Tip poklona:Količina)
1.00 -0.40|1:2          # Odredište 3: Koordinate | Željeni pokloni (Tip poklona:Količina)
-0.70 -0.60|2:2         # Odredište 4: Koordinate | Željeni pokloni (Tip poklona:Količina)

Izlaz

Vaš program bi mogao vratiti:

4|2:2
2|1:1,2:1 1|1:1,2:2 3|1:2
-

Svaki red predstavlja putanju jednih saonica.

Sretno i veselo kodiranje! 🎄📸

Vaše rješenje

Rang lista za ovaj zadatak