using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication13 { enum TypUdalosti { start, prijezdDoA, zacinaNakladat, nalozeno, prijezdDoB, vylozeno }; class Udalost { public int Kdy; public Auto Kdo; public TypUdalosti Co; public Udalost(int Kdy, Auto Kdo, TypUdalosti Co) { this.Kdy = Kdy; this.Kdo = Kdo; this.Co = Co; } } class Kalendar { const int MAX = 100; Udalost[] seznam; int pocet; public Kalendar() { seznam = new Udalost[MAX]; pocet = 0; } public void PLAN(int Kdy, Auto Kdo, TypUdalosti Co) { seznam[pocet] = new Udalost(Kdy, Kdo, Co); pocet++; } public Udalost NajdiVratAVyhodUdalostKeKtereDojdeNejdrive() { if (pocet == 0) { Console.WriteLine("BUG"); return null; } int imin = 0; for (int i = 1; i < pocet; i++) { if (seznam[i].Kdy < seznam[imin].Kdy) imin = i; } Udalost u = seznam[imin]; seznam[imin] = seznam[pocet - 1]; pocet--; return u; } } class Auto { Model model; public string ID; int dobaNakladani; int dobaVykladani; int dobaJizdy; int nosnost; int kolikVeze; public void ZpracujUdalost(TypUdalosti co) { switch (co) { case TypUdalosti.start: break; case TypUdalosti.prijezdDoA: int kdyZacnuNakladat = Math.Max(model.Cas, model.KdyBudeVolnyNakladatel); model.KdyBudeVolnyNakladatel = kdyZacnuNakladat + dobaNakladani; model.PLAN( kdyZacnuNakladat + dobaNakladani, this, TypUdalosti.nalozeno ); break; case TypUdalosti.nalozeno: kolikVeze = Math.Min(nosnost, model.PisekVA); model.PisekVA -= kolikVeze; model.PLAN( model.Cas + dobaJizdy, this, TypUdalosti.prijezdDoB); break; case TypUdalosti.prijezdDoB: model.PLAN( model.Cas + dobaVykladani, this, TypUdalosti.vylozeno ); break; case TypUdalosti.vylozeno: model.PisekVB += kolikVeze; model.PLAN( model.Cas + dobaJizdy, this, TypUdalosti.prijezdDoA); break; default: break; } } public Auto(Model model, string ID, int nosnost, int dobaNakladani, int dobaVykladani, int dobaJizdy) { this.model = model; this.ID = ID; this.nosnost = nosnost; this.dobaNakladani = dobaNakladani; this.dobaVykladani = dobaVykladani; this.dobaJizdy = dobaJizdy; model.PLAN(model.Cas, this, TypUdalosti.prijezdDoA); } } class Model { public int Cas = 0; public int PisekVA; public int PisekVB; Kalendar kalendar; public int KdyBudeVolnyNakladatel; public void PLAN(int Kdy, Auto Kdo, TypUdalosti Co) { kalendar.PLAN(Kdy, Kdo, Co); } public virtual void VytvorAuta() { new Auto(this, "A1", 10, 30, 2, 120); new Auto(this, "A2", 10, 30, 2, 120); new Auto(this, "A3", 30, 120, 2, 360); } public int Vypocet(int KolikPisku) { Cas = 0; PisekVA = KolikPisku; PisekVB = 0; KdyBudeVolnyNakladatel = 0; kalendar = new Kalendar(); VytvorAuta(); while (PisekVB < KolikPisku) { Udalost u = kalendar.NajdiVratAVyhodUdalostKeKtereDojdeNejdrive(); Cas = u.Kdy; //Console.WriteLine( "{0}: {1} {2} pisek v B:{3}", // u.Kdy, u.Kdo.ID, u.Co, PisekVB); u.Kdo.ZpracujUdalost(u.Co); } return Cas; } } class Model2 : Model { int pocetAut; public override void VytvorAuta() { for (int i = 0; i < pocetAut; i++) { new Auto(this, "A"+i.ToString(), 10, 30, 2, 120); } } public int VypocetProPocet( int PocetAut, int kolikPisku ) { this.pocetAut = PocetAut; return Vypocet(kolikPisku); } } class Program { static void Main(string[] args) { Console.WriteLine( "PUVODNI: {0}", new Model().Vypocet(3000) ); for (int i = 1; i < 20; i++) { Console.WriteLine("{0}_{1}", i, new Model2().VypocetProPocet(i,3000)); } Console.ReadLine(); } } }