using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public interface Udalost { void vykonajSa(Park p); } public class Clovek : Udalost { private int peniaze; public Clovek(int peniaze) { this.peniaze = peniaze; } public void vykonajSa(Park p) { // vyberie nahodnu atrakciu Atrakce a = p.dajAtrakce()[Program.rnd.Next(p.dajAtrakce().Count)]; if (a.dajCenu() <= peniaze) { peniaze = peniaze - a.dajCenu(); a.postavDoFronty(this); } else { p.odisielClovek(); } } } public class Atrakce : Udalost { private List fronta; private int kapacita; private int dlzka; private int cena; //statistika private string nazov; private int navstevnikov; private int maxFronta; public int dajCenu() { return cena; } public Atrakce(string nazov, int kapacita, int dlzka, int cena) { this.nazov = nazov; this.kapacita = kapacita; this.dlzka = dlzka; this.cena = cena; navstevnikov = 0; maxFronta = 0; fronta = new List(); } public void vypisStatistiky() { Console.WriteLine("{0} {1} {2} zisk: {3}", nazov, navstevnikov, maxFronta, navstevnikov*cena); } public void postavDoFronty(Clovek c) { fronta.Add(c); navstevnikov++; if (fronta.Count > maxFronta) maxFronta = fronta.Count; } public void vykonajSa(Park p) { int cas = p.dajAktualnyCas(); for (int i = 0; i < kapacita; i++) { if (fronta.Count == 0) break; Clovek c = fronta.First(); fronta.Remove(c); p.naplanuj(c, cas + dlzka); } p.naplanuj(this, cas + dlzka); } } public class Park { private List atrakce; private int navstevnici; private int aktualnyCas; private SortedList> kalendar; public Park(List atrakce, int navstevnici) { this.atrakce = atrakce; this.navstevnici = navstevnici; this.aktualnyCas = 0; kalendar = new SortedList>(); } public List dajAtrakce() { return atrakce; } public int dajAktualnyCas() { return aktualnyCas; } public void odisielClovek() { navstevnici--; } public bool suNavstevnici() { return navstevnici > 0; } public void naplanuj(Udalost u, int cas) { if (kalendar.ContainsKey(cas) == false) kalendar.Add(cas, new List()); kalendar[cas].Add(u); } public Udalost aktualnaUdalost() { aktualnyCas = kalendar.First().Key; List aktualneUdalosti = kalendar[aktualnyCas]; Udalost vybrana = null; foreach (Udalost u in aktualneUdalosti) { if (u is Clovek) { vybrana = u; break; } } if (vybrana == null) vybrana = aktualneUdalosti[0]; aktualneUdalosti.Remove(vybrana); if (aktualneUdalosti.Count == 0) kalendar.Remove(aktualnyCas); return vybrana; } } class Program { public static Random rnd = new Random(); static void Main(string[] args) { List atrakce = new List(); atrakce.Add(new Atrakce("kolotoc", 300, 1, 200)); atrakce.Add(new Atrakce("booster", 4, 5, 200)); atrakce.Add(new Atrakce("twister", 20, 12, 120)); atrakce.Add(new Atrakce("strasidelny dom", 15, 20, 90)); List ludia = new List(); for (int i = 0; i < 100; i++) ludia.Add(new Clovek(rnd.Next(250, 900))); Park p = new Park(atrakce, ludia.Count); foreach (Atrakce a in atrakce) p.naplanuj(a, 0); foreach (Clovek c in ludia) p.naplanuj(c, 0); while (p.suNavstevnici()) p.aktualnaUdalost().vykonajSa(p); foreach (Atrakce a in atrakce) a.vypisStatistiky(); } } }