Advertisement
xxeell

Untitled

Jan 27th, 2018
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.00 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace SolW
  7. {
  8.     class Program
  9.     {
  10.         ///////////////////// TestOutput
  11.         static bool TESTPROGRAMM = false;
  12.         static void cwl(string s, params object[] args)
  13.         {
  14.             if (TESTPROGRAMM)
  15.                 if (args == null) Console.WriteLine(s);
  16.                 else Console.WriteLine(string.Format(s, args));
  17.         }
  18.         static void cw(string s, params object[] args)
  19.         {
  20.             if (TESTPROGRAMM)
  21.                 if (args == null) Console.Write(s);
  22.                 else Console.Write(string.Format(s, args));
  23.         }
  24.         ///////////////////// Vars
  25.         static Worker[] w;
  26.         static int[] workerStatus;
  27.         static Level [] poh;
  28.         static int n, m;
  29.         static Dictionary<int, List<int>> jdut;
  30.         static Lift l;
  31.  
  32.         ///////////////////// Structs
  33.  
  34.         struct Worker
  35.         {
  36.             private int time;
  37.             private int etaj;
  38.             private int outtime;
  39.             private bool jdet;
  40.  
  41.             public Worker(int t, int h)
  42.             {
  43.                 time = t;
  44.                 etaj = h - 1;
  45.                 outtime = 0;
  46.                 jdet = false;
  47.             }
  48.  
  49.             public int t
  50.             {
  51.                 get { return time; }
  52.                 set { time = value; }
  53.             }
  54.             public int h
  55.             {
  56.                 get { return etaj; }
  57.                 set { etaj = value; }
  58.             }
  59.             public int outt
  60.             {
  61.                 get { return outtime; }
  62.                 set { outtime = value; }
  63.             }
  64.             public bool stand
  65.             {
  66.                 get { return jdet; }
  67.                 set { jdet = value; }
  68.             }
  69.         }
  70.  
  71.         struct Level
  72.         {
  73.             private int people;
  74.  
  75.             public Level(int p)
  76.             {
  77.                 people = p;
  78.             }
  79.  
  80.             public int p
  81.             {
  82.                 get { return people; }
  83.                 set { people = value; }
  84.             }
  85.         }
  86.  
  87.         struct Lift
  88.         {
  89.             private int etaj;
  90.             private bool PeopleIn;
  91.             private List<int> WhoIn;
  92.  
  93.             public Lift(int q)
  94.             {
  95.                 etaj = 0;
  96.                 PeopleIn = false;
  97.                 WhoIn = new List<int>();
  98.             }
  99.  
  100.             public int h
  101.             {
  102.                 get { return etaj; }
  103.                 set { etaj = value; }
  104.             }
  105.  
  106.             public bool pin
  107.             {
  108.                 get { return PeopleIn; }
  109.                 set { PeopleIn = value; }
  110.             }
  111.  
  112.             public void addInLift(int i)
  113.             {
  114.                 cwl("w[{0}] go in lift", i);
  115.                 WhoIn.Add(i);
  116.                 w[i].stand = false;
  117.                 //w[i].t = -1;
  118.                 poh[w[i].h].p--;
  119.             }
  120.  
  121.             public void AllOut(int t)
  122.             {
  123.                 if (WhoIn.Capacity == 0) return;
  124.                 foreach (int i in WhoIn)
  125.                 {
  126.                     cwl("w[{0}] go home in {1} time", i, t);
  127.                     w[i].outt = t;
  128.                 }
  129.                 WhoIn.Clear();
  130.             }
  131.         }
  132.  
  133.         ///////////////////// Methods
  134.  
  135.         static void Init()
  136.         {
  137.             int[] inp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
  138.  
  139.             n = inp[0];
  140.             m = inp[1];
  141.  
  142.             w = new Worker[n];
  143.             for (int i = 0; i < n; i++)
  144.             {
  145.                 inp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
  146.                 w[i] = new Worker(inp[0], inp[1]);
  147.             }
  148.             workerStatus = new int[n];
  149.  
  150.             poh = new Level[m];
  151.             for (int i = 0; i < m; i++)
  152.             {
  153.                 poh[i] = new Level(0);
  154.             }
  155.         }
  156.  
  157.         static Dictionary<int, List<int>> PeopleCallLiftInTime(int t)
  158.         {
  159.             Dictionary<int, List<int>> res = new Dictionary<int, List<int>>();
  160.  
  161.             for (int i = 0; i < n; i++)
  162.             {
  163.                 if (w[i].stand)
  164.                 {
  165.                     if (!res.ContainsKey(w[i].t)) res.Add(w[i].t, new List<int>());
  166.                     if (res[w[i].t].IndexOf(w[i].h) == -1)
  167.                     {
  168.                         res[w[i].t].Add(w[i].h);
  169.                         poh[w[i].h].p++;
  170.                         cwl("w[{0}] stand at {1} et at {2} t (now {3})", i, w[i].h, w[i].t, t);
  171.                     }
  172.                 }
  173.                 if (w[i].t == t)
  174.                 {
  175.                     if (!res.ContainsKey(t)) res.Add(t, new List<int>());
  176.                     if (res[t].IndexOf(w[i].h) == -1) res[t].Add(w[i].h);
  177.                     w[i].stand = true;
  178.                     poh[w[i].h].p++;
  179.                     cwl("w[{0}] stand at {1} et at {2} t", i, w[i].h, t);
  180.                 }
  181.             }
  182.  
  183.             if (res.Count == 0) return null;
  184.             return res;
  185.         }
  186.  
  187.         static void cleanH()
  188.         {
  189.             for (int i = 0; i < m; i++)
  190.             {
  191.                 poh[i].p = 0;
  192.             }
  193.         }
  194.  
  195.         static void GoInLift(int ih)
  196.         {
  197.             for (int i = 0; i < n; i++)
  198.             {
  199.                 if (w[i].h == ih && w[i].stand)
  200.                 {
  201.                     l.addInLift(i);
  202.                 }
  203.             }
  204.         }
  205.  
  206.         static bool WorkersCheck()
  207.         {
  208.             for (int i = 0; i < n; i++) if (w[i].outt == 0) return false;
  209.             return true;
  210.         }
  211.  
  212.         static int KudaEhat()
  213.         {
  214.             return jdut[jdut.Keys.ToArray<int>().Min()].ToArray().Min();
  215.         }
  216.  
  217.         static void Main(string[] args)
  218.         {
  219.             Init();
  220.  
  221.             int t;
  222.             l = new Lift(1);
  223.             int path = 0;
  224.             for (t = 0; ;t++ )
  225.             {
  226.                 if (WorkersCheck())
  227.                     break;
  228.  
  229.                 jdut = null;
  230.                 cleanH();
  231.                 jdut = PeopleCallLiftInTime(t);
  232.                 if (l.h == 0)
  233.                 {
  234.                     l.AllOut(t);
  235.                     if (jdut == null) continue;
  236.                     path = 0;
  237.                     path = KudaEhat();
  238.                 }
  239.                
  240.                 if (t == 3)
  241.                 {
  242.                     t = 3;
  243.                 }
  244.                
  245.                 if (poh[l.h].p > 0) GoInLift(l.h);
  246.  
  247.                 if (path > l.h)
  248.                 {
  249.                     l.h++;
  250.                     cwl("Lift at {0} et", l.h);
  251.                 }
  252.                 if (path < l.h)
  253.                 {
  254.                     l.h--;
  255.                     cwl("Lift at {0} et", l.h);
  256.                 }
  257.                 if (path == l.h && path != 0) path = 0;
  258.             }
  259.  
  260.             foreach (Worker i in w) Console.WriteLine(i.outt);
  261.  
  262.  
  263.             //Console.WriteLine();
  264.             //Console.ReadKey();
  265.         }
  266.     }
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement