3236 - Par Impar 2: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Fără descriere a modificării
Linia 35: Linia 35:
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate(i: int, p: int, nums: List[int]) -> bool:
def validare(i, p, nums):
     if not (1 <= i <= 100000 and 1 <= p <= 100000):
     if not (1 <= i <= 100000 and 1 <= p <= 100000):
         return False
         return False
Linia 42: Linia 42:
     return True
     return True


def read_input_file(file_path: str) -> Tuple[int, int, List[int]]:
    with open(file_path, 'r') as f:
        i, p = map(int, f.readline().strip().split())
        nums = list(map(int, f.readline().strip().split()))
    return i, p, nums


def main(i: int, p: int, nums: List[int]) -> None:
def parimpar(a, b, nums):
     evens = [num for num in nums if num % 2 == 0]
     rez1, rez2 = 0, -1
     odds = [num for num in nums if num % 2 == 1]
     for x in nums:
    if len(evens) < p or len(odds) < i:
        if x % 2 == 1:
        print("Nu Exista")
            a -= 1
         return
            if a == 0:
    print(f"{evens[p-1]} {odds[i-1]}")
                rez1 = x
 
         else:
if __name__ == '__main__':
            b -= 1
    file_path = 'parimpar2.in'
            if b == 0:
    i, p, nums = read_input_file(file_path)
                rez2 = x
     if not validate(i, p, nums):
        if a == 0 and b == 0:
         print("Date de intrare invalide")
            break
     if rez1 == 0 or rez2 == -1:
         fout.write("Nu Exista")
     else:
     else:
         main(i, p, nums)
         fout.write(str(rez2) + " " + str(rez1))
</syntaxhighlight>
    fin.close()
    fout.close()


==Explicatie==
Funcția validate verifică dacă datele de intrare sunt valide, adică dacă i și p sunt în intervalul [1, 100000], și dacă toate numerele din lista nums sunt în intervalul [0, 1000000000]. Funcția returnează True dacă datele sunt valide și False altfel.


Funcția read_input_file citește datele de intrare din fișierul dat ca argument și returnează un tuplu cu valorile citite.
if __name__ == '__main__':
    fin = open("parimpar2.in")
    fout = open("parimpar2.out", "w")


Funcția main calculează lista numerelor pare și lista numerelor impare din nums. Apoi, verifică dacă există cel puțin p numere pare și i numere impare în listă. Dacă nu există, afișează mesajul "Nu Exista". Altfel, afișează cel de-al p-lea număr par și al i-lea număr impar din listă.
    i, p = map(int, fin.readline().split())
 
    nums = [int(x) for x in fin.readline().split()]
În funcția principală, mai întâi se citește fișierul de intrare, se validează datele, apoi se calculează și se afișează rezultatul.
    if validare(i, p, nums):
        print("Date de intrare valide")
        parimpar(i, p, nums)
</syntaxhighlight>

Versiunea de la data 26 aprilie 2023 16:17

Cerința

Se dau două numere naturale i p și o listă cu numere naturale. Să se determine al p-lea element par din listă și al i-lea element impar din listă.

Date de intrare

Fișierul de intrare parimpar2.in conține pe prima linie numerele i și p, iar pe a doua linie mai multe numere naturale separate prin spații.

Date de ieșire

Fișierul de ieșire parimpar2.out va conține două numere separate printr-un spațiu, primul reprezentând al p-lea element par, iar al doilea număr reprezentând al i-lea element impar din lista numerelor din fișierul de intrare. Dacă nu avem p elemente pare sau i elemente impare se va afișa mesajul Nu Exista.

Restricții și precizări

1 ≤ i,p ≤ 100.000 numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000

Exemplu:

parimpar2.in 2 2 63 83 60 34 92

parimpar2.out 34 83

Explicație

Primul element par este 60, iar al doilea este 34. Primul element impar este 63</span., iar al doilea este 83. Deci se va afișa în fișierul de ieșire 34 83.

parimpar2.in 3 2 37 93 6 49 9 59

parimpar2.out Nu Exista

Explicație

În fișier se găsesc 3 numere impare, dar se găsește doar unul par.

Rezolvare

def validare(i, p, nums):
    if not (1 <= i <= 100000 and 1 <= p <= 100000):
        return False
    if not all(0 <= num <= 1000000000 for num in nums):
        return False
    return True


def parimpar(a, b, nums):
    rez1, rez2 = 0, -1
    for x in nums:
        if x % 2 == 1:
            a -= 1
            if a == 0:
                rez1 = x
        else:
            b -= 1
            if b == 0:
                rez2 = x
        if a == 0 and b == 0:
            break
    if rez1 == 0 or rez2 == -1:
        fout.write("Nu Exista")
    else:
        fout.write(str(rez2) + " " + str(rez1))
    fin.close()
    fout.close()


if __name__ == '__main__':
    fin = open("parimpar2.in")
    fout = open("parimpar2.out", "w")

    i, p = map(int, fin.readline().split())
    nums = [int(x) for x in fin.readline().split()]
    if validare(i, p, nums):
        print("Date de intrare valide")
        parimpar(i, p, nums)