3760 - Intergalactic: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Cerința == Într-o galaxie îndepărtată, există două echipe de exploratori intergalactici care explorează planete pentru a găsi resurse rare. Fiecare explorator deține un cod unic ordonat crescător, iar scopul lor este de a găsi exploratorii comuni între cele două echipe pentru a forma o alianță puternică. Să se determine codurile comune ale exploratorilor din cele două echipe, utilizând căutarea binară pentru eficiență. == Date de intrare == Programu...)
 
Fără descriere a modificării
 
Linia 1: Linia 1:
== Cerința ==
== Cerința ==
Într-o galaxie îndepărtată, există două echipe de exploratori intergalactici care explorează planete pentru a găsi resurse rare. Fiecare explorator deține un cod unic ordonat crescător, iar scopul lor este de a găsi exploratorii comuni între cele două echipe pentru a forma o alianță puternică. Să se determine codurile comune ale exploratorilor din cele două echipe, utilizând căutarea binară pentru eficiență.
În secolul al XXIII-lea, oamenii au început să străbată spațiul intergalactic. Navele cu ajutorul cărora aceștia călatoresc sunt cu adevărat minuni ale tehnologiei, ele folosind un tip foarte exotic de combustibil. Acest tip de combustibil se poate obține prin combinarea a exact doi reactanți, unul stabil cu unul instabil. Fiecare reactant are atribuită o valoare sub forma unui număr natural nenul. Spunem despre un reactant că este stabil dacă valoarea acestuia este un număr prim și că este instabil dacă valoarea acestuia nu este număr prim. Totuși, nu toate tipurile de combustibil sunt la fel de valoroase. După cum v-ați aștepta, prețul unui tip de combustibil este egal cu suma valorilor reactanților din care acesta este compus.
 
Știind că pe piața intergalactică există N reactanți, să se răspundă la T întrebări de tipul: care este prețul celui de-al K-lea cel mai ieftin tip de combustibil care poate fi creat folosind doar reactanții disponibili pe piață.
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură două liste de numere întregi ordonate crescător, reprezentând codurile unice ale exploratorilor din cele două echipe intergalactice.
Fișierul de intrare intergalactic.in conține pe prima linie numerele N și T, reprezentând numărul de reactanți de pe piață și numărul de întrebări. Pe a doua linie se vor afla N numere separate prin câte un spațiu, reprezentând valorile celor N reactanți. Pe următoarele T linii se va afla câte un singur număr K, cu semnificația din enunț.
== Date de ieșire ==
== Date de iesire ==
Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."
Fișierul de ieșire intergalactic.out va conține T linii, pe linia i aflându-se un singur număr reprezentând răspunsul pentru întrebarea i.
În următorul rând se va afișa pe ecran lista cu codurile comune ale exploratorilor din cele două echipe. Dacă nu există exploratori comuni, se va afișa o listă goală.
 
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."
== Restricții și precizări ==
== Restricții și precizări ==
* 1 ⩽ '''numar_exploratori_echipa1''', '''numar_exploratori_echipa2''' ⩽ 100000
*1 ≤ T ≤ 10
*1 ≤ N ≤ 200.000
*1 ≤ K ≤ 1.000.000.000
*Mereu se vor putea crea cel putin K tipuri de combustibil.
*Nu vor exista 2 reactanți cu aceeași valoare.
*Pe piață vor exista cel puțin un reactant stabil și unul instabil.
*Valoarea unui reactant este mai mică sau egală cu 2.000.000.
*Două tipuri de combustibili cu acelasi preț sunt diferiți dacă provin din perechi de reactanți diferite.
== Exemplu 1 ==
== Exemplu 1 ==
;Intrare
;Intrare
1001 1002 1003 1004 1005<br>
8 3<br>
1003 1004 1005 1006 1007
3 7 2 1 11 8 10 4<br>
15<br>
7<br>
11
;Iesire
;Iesire
Datele de intrare corespund restricțiilor impuse.
19<br>
[1003, 1004, 1005]
11<br>
13


== Exemplu 2 ==
== Rezolvare ==
;Intrare
<syntaxhighlight lang="python" line>
2001 2002 2003 <br>
def citire_date():
3001 3002 3003
    with open("intergalactic.in", "r") as f:
        N, T = map(int, f.readline().strip().split())
        reactanti = list(map(int, f.readline().strip().split()))
        intrebari = [int(f.readline().strip()) for _ in range(T)]
    return N, T, reactanti, intrebari


;Iesire
def pret_combustibili(reactanti):
Datele de intrare corespund restricțiilor impuse.
    preturi = set()
[]
    n = len(reactanti)
    for i in range(n):
        for j in range(n):
            if i != j:
                pret = reactanti[i] + reactanti[j]
                preturi.add(pret)
    return sorted(preturi)


== Rezolvare ==
def scrie_rezultate(rezultate):
<syntaxhighlight lang="python" line>
     with open("intergalactic.out", "w") as f:
def citeste_exploratori():
         for rezultat in rezultate:
     try:
            f.write(f"{rezultat}\n")
        echipa_1 = list(map(int, input("Introduceți codurile unice ale exploratorilor din prima echipă: ").split()))
         echipa_2 = list(map(int, input("Introduceți codurile unice ale exploratorilor din a doua echipă: ").split()))
        return echipa_1, echipa_2
    except ValueError:
        return None, None


def valideaza_date(echipa_1, echipa_2):
def main():
     if 1 <= len(echipa_1) <= 100000 and 1 <= len(echipa_2) <= 100000:
     N, T, reactanti, intrebari = citire_date()
        if all(-10**9 <= cod <= 10**9 for cod in echipa_1) and all(-10**9 <= cod <= 10**9 for cod in echipa_2):
            return True
    return False


def cautare_binara(lista, element):
    # Verificarea restrictiilor
     stanga, dreapta = 0, len(lista) - 1
     assert 1 <= T <= 10, "T trebuie sa fie intre 1 si 10"
     while stanga <= dreapta:
     assert 1 <= N <= 200000, "N trebuie sa fie intre 1 si 200.000"
        mijloc = (stanga + dreapta) // 2
    assert all(1 <= k <= 1000000000 for k in intrebari), "Fiecare intrebare trebuie sa fie intre 1 si 1.000.000.000"
        if lista[mijloc] == element:
    assert all(2000000 <= val <= 1000000000 for val in reactanti), "Fiecare valoare de reactant trebuie sa fie intre 2.000.000 si 1.000.000.000"
            return True
        elif lista[mijloc] < element:
            stanga = mijloc + 1
        else:
            dreapta = mijloc - 1
    return False


def intersectie_exploratori(echipa_1, echipa_2):
    preturi = pret_combustibili(reactanti)
     rezultat = []
     rezultate = [preturi[k - 1] for k in intrebari]
    for cod in echipa_1:
        if cautare_binara(echipa_2, cod):
            rezultat.append(cod)
    return rezultat


def main():
     scrie_rezultate(rezultate)
    echipa_1, echipa_2 = citeste_exploratori()
   
    if echipa_1 is None or echipa_2 is None:
        print("Datele de intrare nu corespund restricțiilor impuse.")
        return
   
    if valideaza_date(echipa_1, echipa_2):
        print("Datele de intrare corespund restricțiilor impuse.")
        rezultat = intersectie_exploratori(echipa_1, echipa_2)
        print(rezultat)
     else:
        print("Datele de intrare nu corespund restricțiilor impuse.")


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()


</syntaxhighlight>
</syntaxhighlight>

Versiunea curentă din 2 iunie 2024 21:17

Cerința

În secolul al XXIII-lea, oamenii au început să străbată spațiul intergalactic. Navele cu ajutorul cărora aceștia călatoresc sunt cu adevărat minuni ale tehnologiei, ele folosind un tip foarte exotic de combustibil. Acest tip de combustibil se poate obține prin combinarea a exact doi reactanți, unul stabil cu unul instabil. Fiecare reactant are atribuită o valoare sub forma unui număr natural nenul. Spunem despre un reactant că este stabil dacă valoarea acestuia este un număr prim și că este instabil dacă valoarea acestuia nu este număr prim. Totuși, nu toate tipurile de combustibil sunt la fel de valoroase. După cum v-ați aștepta, prețul unui tip de combustibil este egal cu suma valorilor reactanților din care acesta este compus.

Știind că pe piața intergalactică există N reactanți, să se răspundă la T întrebări de tipul: care este prețul celui de-al K-lea cel mai ieftin tip de combustibil care poate fi creat folosind doar reactanții disponibili pe piață.

Date de intrare

Fișierul de intrare intergalactic.in conține pe prima linie numerele N și T, reprezentând numărul de reactanți de pe piață și numărul de întrebări. Pe a doua linie se vor afla N numere separate prin câte un spațiu, reprezentând valorile celor N reactanți. Pe următoarele T linii se va afla câte un singur număr K, cu semnificația din enunț.

Date de iesire

Fișierul de ieșire intergalactic.out va conține T linii, pe linia i aflându-se un singur număr reprezentând răspunsul pentru întrebarea i.

Restricții și precizări

  • 1 ≤ T ≤ 10
  • 1 ≤ N ≤ 200.000
  • 1 ≤ K ≤ 1.000.000.000
  • Mereu se vor putea crea cel putin K tipuri de combustibil.
  • Nu vor exista 2 reactanți cu aceeași valoare.
  • Pe piață vor exista cel puțin un reactant stabil și unul instabil.
  • Valoarea unui reactant este mai mică sau egală cu 2.000.000.
  • Două tipuri de combustibili cu acelasi preț sunt diferiți dacă provin din perechi de reactanți diferite.

Exemplu 1

Intrare

8 3
3 7 2 1 11 8 10 4
15
7
11

Iesire

19
11
13

Rezolvare

def citire_date():
    with open("intergalactic.in", "r") as f:
        N, T = map(int, f.readline().strip().split())
        reactanti = list(map(int, f.readline().strip().split()))
        intrebari = [int(f.readline().strip()) for _ in range(T)]
    return N, T, reactanti, intrebari

def pret_combustibili(reactanti):
    preturi = set()
    n = len(reactanti)
    for i in range(n):
        for j in range(n):
            if i != j:
                pret = reactanti[i] + reactanti[j]
                preturi.add(pret)
    return sorted(preturi)

def scrie_rezultate(rezultate):
    with open("intergalactic.out", "w") as f:
        for rezultat in rezultate:
            f.write(f"{rezultat}\n")

def main():
    N, T, reactanti, intrebari = citire_date()

    # Verificarea restrictiilor
    assert 1 <= T <= 10, "T trebuie sa fie intre 1 si 10"
    assert 1 <= N <= 200000, "N trebuie sa fie intre 1 si 200.000"
    assert all(1 <= k <= 1000000000 for k in intrebari), "Fiecare intrebare trebuie sa fie intre 1 si 1.000.000.000"
    assert all(2000000 <= val <= 1000000000 for val in reactanti), "Fiecare valoare de reactant trebuie sa fie intre 2.000.000 si 1.000.000.000"

    preturi = pret_combustibili(reactanti)
    rezultate = [preturi[k - 1] for k in intrebari]

    scrie_rezultate(rezultate)

if __name__ == "__main__":
    main()