<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2338_-_Ski_Pass</id>
	<title>2338 - Ski Pass - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2338_-_Ski_Pass"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;action=history"/>
	<updated>2026-05-01T09:33:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;diff=9793&amp;oldid=prev</id>
		<title>Oros Ioana Diana at 13:24, 18 May 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;diff=9793&amp;oldid=prev"/>
		<updated>2024-05-18T13:24:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;//wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;amp;diff=9793&amp;amp;oldid=9257&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;diff=9257&amp;oldid=prev</id>
		<title>Oros Ioana Diana: Pagină nouă: == Cerința == La un parc de sporturi de iarnă au venit G grupuri de schiori numerotate de la 1 la G. Aceștia coboară pe una dintre cele 2 pârtii disponibile dar urcă cu același teleschi. Teleschiul folosește T-bar-uri, o modalitate eficientă de a urca schiorii pe vârful pârtiei.  Un T-bar poate trage maxim 2 schiori odată. Deoarece sunt 2 pârtii, se formează 2 rânduri de oameni de-o parte și de alta a punctului de urcare în teleschi. Se știe că 2 schiori nu...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;diff=9257&amp;oldid=prev"/>
		<updated>2024-01-08T21:28:50Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Cerința == La un parc de sporturi de iarnă au venit G grupuri de schiori numerotate de la 1 la G. Aceștia coboară pe una dintre cele 2 pârtii disponibile dar urcă cu același teleschi. Teleschiul folosește T-bar-uri, o modalitate eficientă de a urca schiorii pe vârful pârtiei.  Un T-bar poate trage maxim 2 schiori odată. Deoarece sunt 2 pârtii, se formează 2 rânduri de oameni de-o parte și de alta a punctului de urcare în teleschi. Se știe că 2 schiori nu...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Cerința ==&lt;br /&gt;
La un parc de sporturi de iarnă au venit G grupuri de schiori numerotate de la 1 la G. Aceștia coboară pe&lt;br /&gt;
una dintre cele 2 pârtii disponibile dar urcă cu același teleschi. Teleschiul folosește T-bar-uri, o modalitate eficientă de a urca schiorii pe vârful pârtiei.&lt;br /&gt;
&lt;br /&gt;
Un T-bar poate trage maxim 2 schiori odată. Deoarece sunt 2 pârtii, se formează 2 rânduri de oameni de-o parte și de alta a punctului de urcare în teleschi. Se știe că 2 schiori nu vor folosi același T-bar decât dacă fac parte din același grup. De asemenea, niciun schior nu se baga în fața altuia (toți sunt foarte corecți și răbdători). Atunci când un T-bar sosește, primul om de la una dintre cozi se urcă în el și pleacă sau așteaptă să se&lt;br /&gt;
urce încă cineva (din același grup cu el). Acest al doilea schior trebuie sa fie totuși primul de la coada lui (nimeni nu se bagă în față).&lt;br /&gt;
&lt;br /&gt;
Care este numărul minim de T-bar-uri ce trebuie folosite astfel încât toți schiorii de la ambele rânduri să ajungă în vârful pârtiei?&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului de intrare skipassin.txt ​se află numărul de grupuri G. Pe următoarele două linii sunt descrise cele 2 cozi în felul următor: numărul N de oameni de la acea coada urmat de N numere reprezentând grupul din care face parte al i-lea schior (1&amp;lt;=i&amp;lt;=N).&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
În fișierul de ieșire skipassout.txt​ se află un singur număr reprezentând numărul minim de T-bar-uri ce trebuie folosite.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
​*&amp;#039;&amp;#039;&amp;#039;1 ≤ G ≤ 50&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;1 ≤ N ≤ 1000&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Pentru 40% din punctaj una dintre cozi va fi formata doar din oameni din același grup.&lt;br /&gt;
*Pentru 60% din punctaj N &amp;lt;= 10&lt;br /&gt;
*Pentru 90% din punctaj N &amp;lt;= 300&lt;br /&gt;
*Atenție la limita de memorie!&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; skipassin.txt&lt;br /&gt;
: 4&lt;br /&gt;
: 6 1 2 1 3 3 4&lt;br /&gt;
: 4 3 1 2 4&lt;br /&gt;
; skipassout.txt&lt;br /&gt;
: 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; skipassin.txt&lt;br /&gt;
: 3&lt;br /&gt;
: 5 1 2 1 2 3&lt;br /&gt;
: 5 3 1 2 3 1&lt;br /&gt;
; skipassout.txt&lt;br /&gt;
: 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#2338 - Ski Pass&lt;br /&gt;
def minimum_t_bars(G, queues):&lt;br /&gt;
    # Verificăm restricția 1&lt;br /&gt;
    if not (1 &amp;lt;= G &amp;lt;= 50):&lt;br /&gt;
        return False&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm restricția 2&lt;br /&gt;
    for q in queues:&lt;br /&gt;
        if not (1 &amp;lt;= q[0] &amp;lt;= 1000):&lt;br /&gt;
            return False&lt;br /&gt;
        for person in q[1]:&lt;br /&gt;
            if not (1 &amp;lt;= person &amp;lt;= 100):&lt;br /&gt;
                return False&lt;br /&gt;
    &lt;br /&gt;
    # Sortăm cozile în ordine descrescătoare a numărului de oameni din fiecare grup&lt;br /&gt;
    queues.sort(key=lambda x: len(set(x[1])), reverse=True)&lt;br /&gt;
    &lt;br /&gt;
    # Numărul minim de T-bar-uri necesare&lt;br /&gt;
    min_t_bars = 0&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem cozile&lt;br /&gt;
    for q in queues:&lt;br /&gt;
        group_set = set(q[1])&lt;br /&gt;
        &lt;br /&gt;
        # În set-ul group_set vom reține grupurile care încă nu au ajuns sus&lt;br /&gt;
        while group_set:&lt;br /&gt;
            # Prima persoană din coadă&lt;br /&gt;
            first_person = q[1][0]&lt;br /&gt;
            &lt;br /&gt;
            # Eliminăm grupul la care aparține persoana din group_set&lt;br /&gt;
            group_set -= {first_person}&lt;br /&gt;
            &lt;br /&gt;
            # Eliminăm toate persoanele din coada curentă care fac parte din același grup&lt;br /&gt;
            q[1] = q[1][1:]&lt;br /&gt;
            &lt;br /&gt;
            # Eliminăm și grupurile care au ajuns deja sus și nu mai au membri în coadă&lt;br /&gt;
            group_set -= set([x[0] for x in queues if not set(x[1]) &amp;amp; group_set and not x[1]])&lt;br /&gt;
            &lt;br /&gt;
        # Incrementăm numărul minim de T-bar-uri&lt;br /&gt;
        min_t_bars += 1&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm restricția 3&lt;br /&gt;
    if not (min_t_bars &amp;lt;= 2 * G):&lt;br /&gt;
        return False&lt;br /&gt;
    &lt;br /&gt;
    return min_t_bars&lt;br /&gt;
&lt;br /&gt;
# Citim datele de intrare&lt;br /&gt;
try:&lt;br /&gt;
    with open(&amp;#039;skipassin.txt&amp;#039;, &amp;#039;r&amp;#039;) as f:&lt;br /&gt;
        G = int(f.readline().strip())&lt;br /&gt;
        queues = []&lt;br /&gt;
        for _ in range(2):&lt;br /&gt;
            N = int(f.readline().strip())&lt;br /&gt;
            people = list(map(int, f.readline().strip().split()))&lt;br /&gt;
            queues.append((N, people))&lt;br /&gt;
&lt;br /&gt;
    # Calculăm rezultatul&lt;br /&gt;
    result = minimum_t_bars(G, queues)&lt;br /&gt;
&lt;br /&gt;
    # Verificăm rezultatul și scriem în fișierul de ieșire&lt;br /&gt;
    if result is not False:&lt;br /&gt;
        with open(&amp;#039;skipassout.txt&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
            f.write(str(result))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Fals&amp;quot;)&lt;br /&gt;
except Exception as e:&lt;br /&gt;
    print(&amp;quot;Fals&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Schiorii urca în următoarea ordine:&lt;br /&gt;
&lt;br /&gt;
Primul de la a 2-a coada singur&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Primii de la ambele cozi&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Primii de la ambele cozi&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Primul de la prima coada&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Primii 2 de la prima coada&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Primii de la ambele cozi&lt;/div&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
</feed>