using System; using System.Diagnostics; using TypCasu = System.Int32; namespace Pisek { enum TypUdalosti { PrijizdiDoA, ZacinaNakladat, Nalozeno, PrijizdiDoB, Vylozeno } class Udalost { public TypCasu Kdy; public Auto Kdo; public TypUdalosti Co; public Udalost(int kdy, Auto kdo, TypUdalosti co) { Kdy = kdy; Kdo = kdo; Co = co; } } class Kalendar { Udalost[] seznam; int pocet; public Kalendar( int velikost ) { seznam = new Udalost[velikost]; pocet = 0; } public void Pridej( Udalost u ) { System.Diagnostics.Debug.Assert(pocet < seznam.Length, "Preplneny kalendar"); seznam[pocet] = u; pocet++; } public Udalost VyberPrvni() { System.Diagnostics.Debug.Assert(pocet > 0, "Prazdny kalendar"); int prvni = 0; for (int i = 1; i < pocet; i++) if (seznam[i].Kdy < seznam[prvni].Kdy) prvni = i; Udalost prvniUdalost = seznam[prvni]; seznam[prvni] = seznam[pocet - 1]; pocet--; return prvniUdalost; } } class Auto { public string Jmeno; Model model; int dobaNakladani; int dobaVykladani; int dobaJizdy; int nosnost; public Auto(string jmeno, Model model, int dobaNakladani, int dobaVykladani, int dobaJizdy, int nosnost) { Jmeno = jmeno; this.model = model; this.dobaNakladani = dobaNakladani; this.dobaVykladani = dobaVykladani; this.dobaJizdy = dobaJizdy; this.nosnost = nosnost; model.Naplanuj(model.Cas, this, TypUdalosti.PrijizdiDoA); } public void Zpracuj(TypCasu ted, TypUdalosti co) { switch (co) { case TypUdalosti.PrijizdiDoA: TypCasu zacatek; if (model.KdyBudeMozneZacitNakladat <= ted) zacatek = ted; else zacatek = model.KdyBudeMozneZacitNakladat; model.KdyBudeMozneZacitNakladat = zacatek + dobaNakladani; model.Naplanuj(zacatek, this, TypUdalosti.ZacinaNakladat); break; case TypUdalosti.ZacinaNakladat: model.Naplanuj(ted + dobaNakladani, this, TypUdalosti.Nalozeno); break; case TypUdalosti.Nalozeno: model.Naplanuj(ted + dobaJizdy, this, TypUdalosti.PrijizdiDoB); break; case TypUdalosti.PrijizdiDoB: model.Naplanuj(ted + dobaVykladani, this, TypUdalosti.Vylozeno); break; case TypUdalosti.Vylozeno: model.PisekVB += nosnost; model.Naplanuj(ted + dobaJizdy, this, TypUdalosti.PrijizdiDoA); break; default: break; } } } class Model { public int PisekVB; public TypCasu Cas; public TypCasu KdyBudeMozneZacitNakladat; Kalendar kalendar; public void Naplanuj(TypCasu kdy, Auto kdo, TypUdalosti co) { kalendar.Pridej(new Udalost(kdy, kdo, co)); } public virtual void VytvorAuta() { new Auto("Adam", this, 220, 5, 120, 15); new Auto("Bivoj", this, 599, 5, 600, 100); new Auto("Cyril", this, 220, 5, 120, 15); } public TypCasu JakDlouhoToTrvalo(int kolikPisku) { PisekVB = 0; kalendar = new Kalendar(100); //ToDo: velikost kalendare!! VytvorAuta(); while (PisekVB < kolikPisku) { Udalost u = kalendar.VyberPrvni(); Cas = u.Kdy; //Console.WriteLine($"{Cas}: {u.Kdo.Jmeno} {u.Co}"); u.Kdo.Zpracuj(Cas, u.Co); } return Cas; } } class Model2 : Model { public int pocetAut; public Model2(int pocetAut) { this.pocetAut = pocetAut; } public override void VytvorAuta() { for (int i = 0; i < pocetAut; i++) { new Auto("A"+i, this, 220, 5, 120, 15); } } } class Model3 : Model2 { int pocetNakladatelu; public Model3(int pocetAut, int pocetNakladatelu):base (pocetAut) { this.pocetNakladatelu = pocetNakladatelu; } public override void VytvorAuta() { for (int i = 0; i < pocetAut; i++) { new Auto("A" + i, this, 220/pocetNakladatelu, 5, 120, 15); } } } class Program { static void Main(string[] args) { Console.WriteLine(new Model().JakDlouhoToTrvalo(3000)); Console.WriteLine(); for (int i = 1; i <= 10; i++) { Console.WriteLine($"{i}: {new Model2(i).JakDlouhoToTrvalo(3000)}"); } Console.WriteLine(); for (int pocetAut = 1; pocetAut <= 10; pocetAut++) { for (int pocetNakladatelu = 1; pocetNakladatelu <= 10; pocetNakladatelu++) { Console.Write($"{new Model3(pocetAut,pocetNakladatelu).JakDlouhoToTrvalo(3000)} "); } Console.WriteLine(); } } } }