W mieście "Crowded City" jest kłopot z jednym ze skrzyżowań. Choć przecinają się na nim tylko dwie ulice (a właściwie to te dwie ulice łączą się w jedną) to ciągle pojawiają się na tym złączeniu korki. Szeryf policji postanowił zlecić rozwiązanie tego problemu... Tobie. Twoim zadaniem jest napisanie programu który określi jak długo w ciągu każdej minuty powinno palić się zielone światło na każdej z ulic by korek był minimalny, a najlepiej by w ogóle go nie było.
Przyjmujemy, że
-
Każda z łączących się ulic ma tylko dwa światła:
-
zielone (auta z tej ulicy mogą jechać dalej, zaś auta z przeciwnej ulicy czekają)
-
czerwone (auta z tej ulicy stoją i czekają aż pojadą auta z przeciwnej ulicy)
-
Jeśli jedna ulica ma zielone światło to druga ulica ma czerwone światło i odwrotnie.
-
Pełen obieg świateł wynosi 1 minutę. To znaczy, że na przykład:
-
jeśli ulica A ma swiatło zielone światło 10 sekund, to ulica B ma zielone światło 50 sekund.
-
jeśli ulica A ma swiatło zielone światło 45 sekund, to ulica B ma zielone światło 15 sekund.
-
jeśli ulica A ma swiatło zielone światło 1 sekundę, to ulica B ma zielone światło 59 sekund.
-
Podział między zielonym a czerwonym światłem na danej ulicy jest stały w czasie i Twój program ma ten podział ustalić. Na przykład Twój program ma ustalić, że ulica A ma zielone światło 15 sekund w ciągu każdej minuty, zaś ulica B ma zielone światło 45 sekund w ciągu każdej minuty.
Tak więc podział zielonego światła między ulicami nie może się zmieniać w czasie. Ty masz ustalić jaki jest optymalny podział z punktu widzenia całości podanego natężenia ruchu aut.
-
Ilość aut jaka przejedzie daną ulicą jest proporcjonalna do
-
czasu zielonego światła na tej ulicy
-
przepustowości tej ulicy
Jeśli
-
przepustowość ulicy A wynosi 120 aut na minutę
-
ulica A ma zielone światło w ciągu 20 sekund (z kązdej minuty)
to w ciągu każdej minuty z ulicy A skrzyżowanie przejedzie 40 aut (1/3 pełnej przepustowości ulicy A)
Wywołanie procedury:
? StopKorkom [120 80] [[1 2] [60 40] [4 3]]
oznacza, że:
-
Na podstawie pierwszej głównej listy otrzymujemy:
-
Przepustowość ulicy A wynosi 120 aut na minutę
-
Przepustowość ulicy B wynosi 80 aut na minutę
-
Na podstawie drugiej głównej listy otrzymujemy:
-
Na podstawie pierwszej podlisty otrzymujemy:
W pierwszej minucie nadjechało do skrzyżowania 1 auto z ulicy A i 2 auta z ulicy B
-
Na podstawie drugiej podlisty otrzymujemy:
W drugiej minucie nadjechało do skrzyżowania 60 aut z ulicy A i 40 aut z ulicy B
-
Na podstawie trzeciej podlisty otrzymujemy:
W trzeciej minucie nadjechały do skrzyżowania 4 auta z ulicy A i 3 auta z ulicy B
Wywołanie powyższej procedury powinno spowodować wypisanie na ekranie następującego komunikatu:
W ciągu każdej minuty droga A powinna mieć ustawione zielone swiatło na 30 sekund, droga B powinna mieć ustawione zielone światło na 30 sekund.
Dlaczego taki podział zielonego światła w ciągu każdej minuty? Zauważmy że
-
W pierwszej minucie auta z każdej ulicy przejadą przez skrzyżowanie praktycznie bez względu na to jak długo każda z ulic ma zielone światło (korek nie utworzy się).
-
W drugiej minucie
-
Droga A ma zielone światło przez 30 sekund czyli przejedzie nią połowa aut z pełnej przepustowości drogi A czyli 120/2 = 60 aut - właśnie tyle ile nadjechałao w drugiej minucie drogą A. Zatem korek na ulicy A nie utworzy się.
-
Droga B ma zielone światło przez 30 sekund czyli przejedzie nią połowa aut z pełnej przepustowości drogi B czyli 80/2 = 40 aut - właśnie tyle ile nadjechałao w drugiej minucie drogą B. Zatem korek na ulicy B się nie utworzy.
-
W trzeciej minucie auta przejadą praktycznie bez względu na to jak długo każda z ulic ma zielone światło - podział zielonego światła 30 sekund do 30 sekund jest dobry.
Wywołanie procedury:
? StopKorkom [60 60] [[80 40] [20 160]]
oznacza, że:
-
Na podstawie pierwszej głównej listy otrzymujemy:
-
Przepustowość ulicy A wynosi 60 aut na minutę (przyjmując, że ulica A ma cały czas zielone światło)
-
Przepustowość ulicy B wynosi 60 aut na minutę (przyjmując, że ulica B ma cały czas zielone światło)
-
Na podstawie drugiej głównej listy otrzymujemy:
-
Na podstawie pierwszej podlisty otrzymujemy:
W pierwszej minucie nadjechało do skrzyżowania 80 aut z ulicy A i 40 aut z ulicy B
-
Na podstawie drugiej podlisty otrzymujemy:
W drugiej minucie nadjechało do skrzyżowania 20 aut z ulicy A i 160 aut z ulicy B
Wywołanie powyższej procedury powinno spowodować wypisanie na ekranie następującego komunikatu:
W ciągu każdej minuty droga A powinna mieć ustawione zielone swiatło na 20 sekund, droga B powinna mieć ustawione zielone światło na 40 sekund.
Dlaczego taki podział zielonego światła w ciągu każdej minuty? Zauważmy że
-
W pierwszej minucie idealnie jest ustawić zielone światło na 40 sekund dla A i 20 sekund dla B. Wówczas (nie wuzględniając ruchu z drugiej minuty) korek rozładuje się w drugiej minucie i będzie to najkrótszy czas korka.
-
Jednak tak czy inaczej część samochodów zarówno z ulicy A jak i ulicy B nie przejedzie przez skrzyżowanie w ciągu pierwszej minuty. Dlatego rozpatrując łącznie pierwsze dwie minuty widzimy, że nadjeżdza do skrzyżowania 100 aut ulicą A i 200 ulicą B. Ustaiwając przepustowość:
-
Droga A ma zielone światło przez 20 sekund mamy, że w ciągu każdej minuty przez skryżowanie przejedzie 20 aut z drogi A i wszystkie auta (100) z drogi A przejadą przez skrzyżowanie w ciągu 5 minut.
-
Droga B ma zielone światło przez 40 sekund mamy, że w ciągu każdej minuty przez skryżowanie przejedzie 40 aut z drogi N i wszystkie auta (200) z drogi B przejadą przez skrzyżowanie w ciągu 5 minut.
Czyli wszystkie auta z obu dróg przejadą w ciągu 5 minut przez skrzyżowanie co jest najkrótszym możliwym czasem.
Wywołanie procedury:
? StopKorkom [60 60] [[30 40] [60 40]]
oznacza, że:
-
Na podstawie pierwszej głównej listy otrzymujemy:
-
Przepustowość ulicy A wynosi 60 aut na minutę (przyjmując, że ulica A ma cały czas zielone światło)
-
Przepustowość ulicy B wynosi 60 aut na minutę (przyjmując, że ulica B ma cały czas zielone światło)
-
Na podstawie drugiej głównej listy otrzymujemy:
-
Na podstawie pierwszej podlisty otrzymujemy:
W pierwszej minucie nadjechało 1 auto z ulicy A i 2 auta z ulicy B
-
Na podstawie drugiej podlisty otrzymujemy:
W drugiej minucie nadjechało 60 aut z ulicy A i 40 aut z ulicy B
Wywołanie powyższej procedury powinno spowodować wypisanie na ekranie następującego komunikatu:
W ciągu każdej minuty droga A powinna mieć ustawione zielone swiatło na 30 sekund, droga B powinna mieć ustawione zielone światło na 30 sekund.
Dlaczego taki podział zielonego światła w ciągu każdej minuty? Zauważmy że
-
W pierwszej minucie auta przejadą praktycznie bez względu na to jaki długo każda z ulic ma zielone światło
-
W drugiej minucie
-
Droga A ma zielone światło przez 30 sekund czyli przejedzie połowa aut z pełnej przepustowości drogi A czyli 120/2 = 60 aut - tyle ile nadjechałao w drugiej minucie drogą A. Zatem korek na ulicy A się nie utworzy.
-
Droga B ma zielone światło przez 30 sekund czyli przejedzie połowa aut z pełnej przepustowości drogi B czyli 80/2 = 40 aut - tyle ile nadjechałao w drugiej minucie drogą B. Zatem korek na ulicy B się nie utworzy.