using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication16 { enum TypUdalosti { PrijezdDoA, ZacinaNakladat, Nalozeno, PrijezdDoB, Vylozeno } class Udalost { public int Kdy; public TypUdalosti Co; public Auto Kdo; public Udalost( int Kdy, TypUdalosti Co, Auto Kdo) { this.Kdy = Kdy; this.Co = Co; this.Kdo = Kdo; } } class Auto { int DobaJizdyAB; public int DobaNakladani; int DobaVykladani; int Nosnost; Model mujModel; public Auto(Model model, int DobaJizdyAB, int DobaNakladani, int DobaVykladani, int Nosnost) { mujModel = model; this.DobaJizdyAB = DobaJizdyAB; this.DobaNakladani = DobaNakladani; this.DobaVykladani = DobaVykladani; this.Nosnost = Nosnost; model.Naplanuj(0, this, TypUdalosti.PrijezdDoA); } public void Zpracuj(TypUdalosti CoSeStalo ) { switch (CoSeStalo) { case TypUdalosti.PrijezdDoA: int KdyBuduMociZacitNakladat = Math.Max( mujModel.Cas, mujModel.KdyBudeMozneZacitNakladat); mujModel.KdyBudeMozneZacitNakladat = KdyBuduMociZacitNakladat + DobaNakladani; mujModel.Naplanuj( mujModel.KdyBudeMozneZacitNakladat, this, TypUdalosti.Nalozeno ); break; case TypUdalosti.ZacinaNakladat: mujModel.Naplanuj( mujModel.Cas + DobaNakladani, this, TypUdalosti.Nalozeno); break; case TypUdalosti.Nalozeno: mujModel.Naplanuj( mujModel.Cas + DobaJizdyAB, this, TypUdalosti.PrijezdDoB); break; case TypUdalosti.PrijezdDoB: mujModel.Naplanuj( mujModel.Cas + DobaVykladani, this, TypUdalosti.Vylozeno); break; case TypUdalosti.Vylozeno: mujModel.Naplanuj( mujModel.Cas + DobaJizdyAB, this, TypUdalosti.PrijezdDoA); mujModel.PisekVB += Nosnost; break; default: break; } } } class Kalendar { static int MAX = 100; Udalost[] seznam = new Udalost[MAX]; int Pocet = 0; public void Pridej(Udalost U) { seznam[Pocet] = U; Pocet++; } public Udalost Vyber() { int mini = 0; for (int i = 1; i < Pocet; i++) { if ((seznam[i].Kdy < seznam[mini].Kdy)|| ((seznam[i].Kdy == seznam[mini].Kdy) && (seznam[i].Kdo.DobaNakladani < seznam[mini].Kdo.DobaNakladani)) ) mini = i; } Udalost U = seznam[mini]; seznam[mini] = seznam[Pocet - 1]; Pocet--; return U; } } class Model { public int Cas; public int PisekVB; int PisekCelkem; public int KdyBudeMozneZacitNakladat; Kalendar kalendar; public void Naplanuj( int Kdy, Auto Kdo, TypUdalosti Co) { kalendar.Pridej(new Udalost(Kdy, Co, Kdo)); } public virtual void VytvorAuta() { new Auto(this, 120, 60, 6, 10); new Auto(this, 120, 60, 6, 10); new Auto(this, 360, 90, 6, 20); } public int Vypocti( int PisekVA) { PisekCelkem = PisekVA; PisekVB = 0; Cas = 0; KdyBudeMozneZacitNakladat = 0; kalendar = new Kalendar(); VytvorAuta(); while (PisekVB < PisekCelkem) { Udalost U = kalendar.Vyber(); //Console.WriteLine("{0}: {1} {2}",U.Kdy, U.Kdo, U.Co); Cas = U.Kdy; U.Kdo.Zpracuj(U.Co); } return Cas; } } class Model2 : Model { int pocetAut; public Model2( int pocetAut) { this.pocetAut = pocetAut; } public override void VytvorAuta() { for (int i = 0; i < pocetAut; i++) { new Auto(this, 120, 60, 6, 10); } } } class Model3 : Model2 { } class Program { static void Main(string[] args) { int KOLIK = 3000; Console.WriteLine( new Model().Vypocti(KOLIK) ); for (int i = 1; i < 20; i++) { Console.WriteLine("{0}; {1}",i, new Model2(i).Vypocti(KOLIK) ); } } } }