1264 - StatisticiOrdine

From Bitnami MediaWiki

Sursa: 1264 - Statistici Ordine


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemplu[edit | edit source]

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[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<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>