using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Cas = System.Int32; namespace ConsoleApp4 { enum TypUdalosti { PrijezdDoA, Nalozeno, PrijezdDoB, Vylozeno } class Udalost { public Cas Kdy; public Auto Kdo; public TypUdalosti Co; public Udalost(int kdy, Auto kdo, TypUdalosti co) { Kdy = kdy; Kdo = kdo; Co = co; } } class Auto { public int DobaNakladani; public int DobaVykladani; public int DobaJizdyAB; public int Nosnost; public int Veze; public string ID; Model model; static int Cislo = 1; public Auto(Model model, int dobaNakladani, int dobaVykladani, int dobaJizdyAB, int nosnost) { ID = "auto-" + Auto.Cislo.ToString(); Auto.Cislo++; this.model = model; DobaNakladani = dobaNakladani; DobaVykladani = dobaVykladani; DobaJizdyAB = dobaJizdyAB; Nosnost = nosnost; model.Naplanuj(model.Ted, this, TypUdalosti.PrijezdDoA); } public void ZpracujUdalost( TypUdalosti co) { switch (co) { case TypUdalosti.PrijezdDoA: Cas kdyBuduNalozeno = Math.Max( model.Ted, model.KdyBudeMozneZacitZaseNakladat) +DobaNakladani; model.KdyBudeMozneZacitZaseNakladat = kdyBuduNalozeno; model.Naplanuj(kdyBuduNalozeno, this, TypUdalosti.Nalozeno); break; case TypUdalosti.Nalozeno: Veze = Math.Min(Nosnost, model.pisekVA); model.pisekVA -= Veze; model.Naplanuj( model.Ted + DobaJizdyAB, this, TypUdalosti.PrijezdDoB); break; case TypUdalosti.PrijezdDoB: model.Naplanuj( model.Ted + DobaVykladani, this, TypUdalosti.Vylozeno); break; case TypUdalosti.Vylozeno: model.pisekVB += Veze; model.Naplanuj( model.Ted + DobaJizdyAB, this, TypUdalosti.PrijezdDoA); break; default: break; } } } class Kalendar { Udalost[] seznam = new Udalost[100]; //TODO ten pocet resit poradne!! int pocet = 0; public void Naplanuj(Udalost u) { //TODO: hlidat preteceni!! seznam[pocet] = u; pocet++; } public Udalost Vyber() { if (pocet==0) throw new Exception("prazdny seznam"); int min = seznam[0].Kdy; int mini = 0; for (int i = 1; i < pocet; i++) { if (seznam[i].Kdy < min) { min = seznam[i].Kdy; mini = i; } } Udalost prvni = seznam[mini]; seznam[mini] = seznam[pocet - 1]; pocet--; return prvni; } } class Model { public int pisekVA; public int pisekVB; Kalendar kalendar; public Cas Ted; public Cas KdyBudeMozneZacitZaseNakladat; public void Naplanuj( Cas kdy, Auto kdo, TypUdalosti co) { kalendar.Naplanuj(new Udalost(kdy, kdo, co)); } public virtual void VytvorAuta() { new Auto(this, 60, 5, 120, 15); new Auto(this, 60, 5, 120, 15); new Auto(this, 180, 5, 360, 50); } public int Pocitej(int pisekCelkem) { Ted = 0; this.pisekVA = pisekCelkem; this.pisekVB = 0; kalendar = new Kalendar(); VytvorAuta(); while (pisekVB < pisekCelkem) { Udalost u = kalendar.Vyber(); Ted = u.Kdy; //Console.WriteLine("{0}: {1} {2} {3}", // u.Kdy, // u.Kdo.ID, // u.Kdo.Veze, // u.Co.ToString() // ); u.Kdo.ZpracujUdalost(u.Co); } return Ted; } } class Model2: Model { protected int pocetAut; public Model2(int pocetAut) { this.pocetAut = pocetAut; } public override void VytvorAuta() { for (int i = 0; i < pocetAut; i++) { new Auto(this, 60, 5, 120, 15); } } } class Model3:Model2 { int pocetLidi; public Model3(int pocetLidi, int pocetAut): base(pocetAut) { this.pocetLidi = pocetLidi; } public override void VytvorAuta() { for (int i = 0; i < pocetAut; i++) { new Auto(this, 60 / pocetLidi, 5, 120, 15); } } } class Program { static void Main(string[] args) { Console.WriteLine( new Model().Pocitej(3000) ); for (int i = 1; i <= 10; i++) { Console.WriteLine( "{0};{1}", i, new Model2(i).Pocitej(3000) ); } for (int auta = 1; auta <= 10; auta++) { for (int lidi = 1; lidi <= 20; lidi++) { Console.Write("{0};", new Model3(lidi, auta).Pocitej(3000)); } Console.WriteLine(); } } } }