using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication20 { enum TypUdalosti {PrijezdDoA, ZacinaNakladat, Nalozeno, ZacinaVykladat,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 = new Udalost[MAX]; int pocet = 0; public void Pridej( Udalost u) { // TODO: resit zaplneni pole seznam[pocet] = u; pocet++; } public Udalost NajdiAVymazUdalostSNejmensimCasem() { int mini = 0; for (int i = 1; i < pocet; i++) { if (seznam[i].Kdy < seznam[mini].Kdy) mini = i; } Udalost u = seznam[mini]; seznam[mini] = seznam[pocet - 1]; pocet--; return u; } } class Auto { public string ID; int nosnost; int dobaJizdyAB; int dobaNakladani; int dobaVykladani; int naklad; Model model; public Auto( Model model, string ID, int nosnost, int dobaJizdyAB, int dobaNakladani, int dobaVykladani ) { this.ID = ID; this.model = model; this.nosnost = nosnost; this.dobaJizdyAB = dobaJizdyAB; this.dobaNakladani = dobaNakladani; this.dobaVykladani = dobaVykladani; model.Naplanuj( model.Cas, this, TypUdalosti.PrijezdDoA); } public void ZpracujUdalost( TypUdalosti Co) { switch (Co) { case TypUdalosti.PrijezdDoA: int KdyZacnuNakladat = Math.Max (model.Cas, model.KdyBudeMozneZacitNakladat); model.KdyBudeMozneZacitNakladat = KdyZacnuNakladat + dobaNakladani; model.Naplanuj(model.KdyBudeMozneZacitNakladat, this, TypUdalosti.Nalozeno); break; case TypUdalosti.ZacinaNakladat: break; case TypUdalosti.Nalozeno: model.Naplanuj(model.Cas + dobaJizdyAB, this, TypUdalosti.ZacinaVykladat); naklad = Math.Min(nosnost, model.PisekVA); model.PisekVA -= naklad; break; case TypUdalosti.ZacinaVykladat: model.Naplanuj(model.Cas + dobaVykladani, this, TypUdalosti.Vylozeno); break; case TypUdalosti.Vylozeno: model.Naplanuj(model.Cas + dobaJizdyAB, this, TypUdalosti.PrijezdDoA); model.PisekVB += naklad; break; default: break; } } } class Model { public int PisekVB; public int PisekVA; protected int PisekCelkem; public int Cas; Kalendar kalendar; public int KdyBudeMozneZacitNakladat; public void Naplanuj( int Kdy, Auto Kdo, TypUdalosti Co) { kalendar.Pridej( new Udalost( Kdy, Kdo, Co ) ); } public Model( int PisekCelkem ) { this.PisekCelkem = PisekCelkem; } public virtual void VytvorAuta() { new Auto(this, "X", 10, 2 * 60, 60, 5); new Auto(this, "Y", 15, 3 * 60, 100, 5); new Auto(this, "Z", 50, 8 * 60, 600, 5); } public int Vypocet() { this.PisekVB = 0; this.PisekVA = PisekCelkem; Cas = 0; KdyBudeMozneZacitNakladat = Cas; kalendar = new Kalendar(); VytvorAuta(); while (PisekVB < PisekCelkem) { Udalost u = kalendar.NajdiAVymazUdalostSNejmensimCasem(); Cas = u.Kdy; u.Kdo.ZpracujUdalost(u.Co); } return Cas; } } class Model2 : Model { protected int PocetAut; public Model2( int PisekCelkem, int PocetAut) : base( PisekCelkem) { this.PocetAut = PocetAut; } public override void VytvorAuta() { for (int i = 0; i < PocetAut; i++) { new Auto(this, "X_"+i.ToString(), 10, 2 * 60, 60, 5); } } } class Model3:Model2 { int PocetNakladatelu; public Model3( int PisekCelkem, int PocetAut, int PocetNakladatelu) : base( PisekCelkem, PocetAut) { this.PocetNakladatelu = PocetNakladatelu; } public override void VytvorAuta() { for (int i = 0; i < PocetAut; i++) { new Auto(this, "X_" + i.ToString(), 10, 2 * 60, 60/PocetNakladatelu, 5); } } } class Program { static void Main(string[] args) { Console.WriteLine( (new Model( 3000 )).Vypocet() ); Console.WriteLine("-----------------------------------"); for (int i = 1; i <= 10; i++) { Console.WriteLine( "{0}: {1}", i, (new Model2( 3000, i )).Vypocet() ); } Console.WriteLine("-----------------------------------"); for (int aut = 1; aut <= 10; aut++) { for (int nakl = 1; nakl <= 5; nakl++) { Console.Write( "{0}:", new Model3( 3000, aut, nakl ).Vypocet()); } Console.WriteLine(); } } } }