1264 - StatisticiOrdine

From Bitnami MediaWiki
Revision as of 12:20, 21 February 2023 by Bogdan.Pop (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: 1264 - Statistici Ordine


Cerinţa

Se dă un şir arr cu numar_elemente elemente, numere naturale. Să se afișeze al numar_dorit-lea cel mai mic element din șir.

Date de intrare

Programul citește din fișierul de intrare statisticiordine.in numărul numar_elemente și numar_dorit, iar apoi, pe rândul următor, cele numar_elemente elemente ale şirului arr.

Date de ieșire

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse.", iar în fișierul de ieșire statisticiordine.out numărul căutat. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, programul va afișa "Datele de intrare nu corespund restricțiilor impuse.", iar fișierul statisticiordine.out va ramane gol.

Restricţii şi precizări

  • numar_elemente, numar_dorit ∈ ℕ
  • 1 ⩽ numar_doritnumar_elemente ⩽ 4.000.000
  • element arr ∈ ℕ
  • 0 ⩽ element arr < 4.000.000.000

Exemplu

Intrare statisticiordine.in
6 4
1 58 4 3 24 50
Ieșire Ecran
Datele de intrare corespund restricțiilor impuse.
Ieșire statisticiordine.out
24


Intrare statisticiordine.in
3 5
abc 63.5 -24
Ieșire Ecran
Datele de intrare nu corespund restricțiilor impuse.
Ieșire statisticiordine.out


Intrare statisticiordine.in
-2 3
Ieșire Ecran
Datele de intrare nu corespund restricțiilor impuse.
Ieșire statisticiordine.out


Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 1264 - Statistici Ordine

def validare_date_numar(numar_elemente: str, numar_dorit: str) -> bool:

   try:
       int(numar_elemente), int(numar_dorit)
       
       if 1 <= int(numar_elemente) <= 4_000_000 and int(numar_dorit) <= int(numar_elemente):
           return True
       else:
           raise ValueError
   except ValueError:
       return False
   
   

def validare_date_sir(lista: list) -> bool:

   return all(0 <= int(element) < 4_000_000_000 for element in lista)


def partition(arr: list, low: int, high: int):

   pivot = arr[high]
   
   indice1 = low - 1
   
   for indice2 in range(low, high):
       if arr[indice2] <= pivot:
           indice1 += 1
           arr[indice1], arr[indice2] = arr[indice2], arr[indice1]
   
   arr[indice1 + 1], arr[high] = arr[high], arr[indice1 + 1]
   
   return indice1 + 1


def quicksort(arr: list, low: int, high: int):

   if low < high:
       poz = partition(arr, low, high)
       quicksort(arr, low, poz - 1)
       quicksort(arr, poz + 1, high)
       

def statistici_ordine(arr: list, numar_elemente: int, pozitie: int) -> int:

   quicksort(arr, 0, numar_elemente - 1)
   
   return arr[pozitie - 1]


if __name__ == "__main__":

   file_input = open("statisticiordine.in", "r")
   file_output = open("statisticiordine.out", "w")
   
   line1 = file_input.readline()
   line1 = line1.split(" ")
   
   numar_elemente = line1[0]
   numar_dorit = line1[1]
   
   if validare_date_numar(numar_elemente, numar_dorit):
       numar_elemente, numar_dorit = int(numar_elemente), int(numar_dorit) 
       
       line2 = file_input.readline()
       arr = line2.split(" ")
       if validare_date_sir(arr):
           arr = list(map(int, arr))
           
           print("Datele de intrare corespund restricțiilor impuse.")
           file_output.write(str(statistici_ordine(arr, numar_elemente, numar_dorit)))
       else:
           print("Datele de intrare nu corespund restricțiilor impuse.")
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")
       

</syntaxhighlight>