2073 - PlatouK v2: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
 
(One intermediate revision by the same user not shown)
Line 43: Line 43:
* dacă sunt mai multe platouri de lungime maxima se va afișa cel mai mare considera cel format din valoarea cea mai mare
* dacă sunt mai multe platouri de lungime maxima se va afișa cel mai mare considera cel format din valoarea cea mai mare
toate testele au soluție
toate testele au soluție
== Exemplu 1 ==
; Intrare
; Intrare
: 2
: 2
Line 49: Line 51:
: 1
: 1
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele sunt introduse corect.
: Datele sunt introduse correct.
: 4
: 4
== Exemplu 2 ==
; Intrare
: 2
: 6
: 2 2 2 3 3 3
: 1
; Ieșire
: Datele nu corespund restrictiilor impuse


== Rezolvare ==  
== Rezolvare ==  
Line 58: Line 69:
# 2073 - PlatouK v2
# 2073 - PlatouK v2


def citire_lista():
def validate_input(k, n, arr):
     try:
     if not 1 <= k <= 100 or not 1 <= n <= 1000000:
         k = int(input())
         return False
         n = int(input())
    if len(arr) != n:
        lista = list(map(int, input().split()))
        return False
         p = int(input())
    for i in arr:
         return k, lista, p
         if not 0 <= i <= 10000:
     except:
            return False
    return True
 
 
def find_longest_plateau(k, arr):
    n = len(arr)
    longest_plateau = 0
    plateau_element = -1
 
    for i in range(n):
        j = i + 1
        while j < n and arr[i] == arr[j]:
            j += 1
         plateau_len = j - i
         if plateau_len > longest_plateau:
            longest_plateau = plateau_len
            plateau_element = arr[i]
 
    return longest_plateau, plateau_element
 
 
def solve(k, n, arr):
     if not validate_input(k, n, arr):
         print("Datele nu corespund restrictiilor impuse.")
         print("Datele nu corespund restrictiilor impuse.")
        return


def rezolva(k, lista):
    for i in range(k):
    try:
         plateau_len, plateau_element = find_longest_plateau(1, arr)
         # calculam dictionarul frecventelor
         if plateau_len == 0:
         frecvente = {}
             break
        for element in lista:
        arr.remove(plateau_element)
             frecvente[element] = frecvente.get(element, 0) + 1
         _, new_element = find_longest_plateau(1, arr)
          
         arr.insert(arr.index(new_element) + 1, plateau_element)
        # gasim elementul cu cea mai mare frecventa
 
        max_frecventa = max(frecvente.values())
    plateau_len, plateau_element = find_longest_plateau(1, arr)
         element_max_frecventa = max(k for k, v in frecvente.items() if v == max_frecventa)
     print(plateau_len)
       
        # calculam lungimea maxima a unui platou dupa k operatii
        lungime_maxima = min(max_frecventa + k, len(lista))
        return lungime_maxima if p == 1 else element_max_frecventa
     except:
        print("Datele nu corespund restrictiilor impuse.")


def valideaza(valoare):
    try:
        if isinstance(valoare, int):
            print("Datele sunt introduse corect.")
            print(valoare)
        else:
            print("Datele sunt introduse corect.")
            print(*valoare)
    except:
        print("Datele nu corespund restrictiilor impuse.")


if __name__ == "__main__":
if __name__ == "__main__":
     k, lista, p = citire_lista()
     k = int(input())
     rezultat = rezolva(k, lista)
    n = int(input())
     valideaza(rezultat)
     arr = list(map(int, input().split()))
     p = int(input())


    if p == 1:
        solve(k, n, arr)
    else:
        print("Datele sunt introduse corect.")




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Funcția citire_lista() primește datele de intrare și le citește folosind funcții predefinite în Python. Aceasta returnează un tuplu format din k, lista și p.
validare(n, k, sir, cerinta) - Aceasta este o funcție de validare care primește ca parametri: n - numărul de elemente din șir, k - numărul maxim de operații permise, sir - lista cu elemente din șir și cerinta - un intreg care specifica cerinta (1 sau 2). Funcția validează inputul și returnează True dacă valorile de intrare sunt corecte, altfel returnează False.
 
lungime_platou(platou) - Această funcție primește ca parametru un platou, adică o secvență formată din valori identice. Funcția calculează și returnează lungimea platoului, adică numărul de elemente care îl formează.
 
rezolva(sir, k) - Această funcție primește ca parametri: sir - lista cu elemente din șir și k - numărul maxim de operații permise. Funcția calculează lungimea maximă a unui platou care poate să apară în șir în urma efectuării operației de maxim k ori și elementul din care este format platoul obținut după cele k operații și returnează aceste valori.


Funcția rezolva(k, lista) primește k și lista citite de la intrare și implementează algoritmul descris în cerință pentru a determina lungimea maximă a unui platou sau elementul din care este format platoul, în funcție de cerința specificată. Pentru a face acest lucru, funcția calculează mai întâi un dicționar al frecvențelor elementelor din lista și găsește elementul cu cea mai mare frecvență. Pentru a găsi lungimea
main() - Aceasta este funcția principală a programului, care se execută atunci când rulăm scriptul. Funcția citeste input-ul de la utilizator, validează inputul și apoi calculează și afișează rezultatul.

Latest revision as of 21:02, 14 May 2023

Sursa: - PlatouK v2


Cerinţa[edit | edit source]

Fiind dat un șir de numere, numim secvenţă a acestuia o parte dintre termenii şirului luaţi de pe poziţii consecutive. Denumim platou al acestui şir o secvenţă formată din valori identice. Lungimea unui platou este egală cu numărul de elemente care îl formează.

De exemplu, în şirul de numere 1 1 1 7 7 3 4 4 4 7 7 avem:

platourile 1 1 1 şi 4 4 4 ambele având lungimea 3; platourile 7 7 (cel care începe în poziţia a patra) şi 7 7 (cel care începe pe poziţia a zecea), ambele având lungimea 2; platoul 3 care are lungimea 1. În schimb nu avem platoul 7 7 7 7 deoarece cele patru elemente egale cu 7 nu sunt pe poziţii consecutive!

Asupra unui şir se poate efectua următoarea operaţiune:

se extrage un platou la alegere; se inserează platoul extras la pasul anterior într-o poziţie la alegere din şirul rezultat după extragere. De exemplu, dacă avem următorul şir inițial: 2 2 5 0 5 8 8 8 4 9 9 9 0 0 2 2 8 extragem platoul 2 2 format din elementele aflate în penultima şi antepenultima poziţie şi obţinem şirul: 2 2 5 0 5 8 8 8 4 9 9 9 0 0 8

În şirul rezultat inserăm platoul 2 2 (pe care l-am extras în pasul anterior) în poziţia a doua şi obţinem şirul: 2 2 2 2 5 0 5 8 8 8 4 9 9 9 0 0 8. Să se scrie un program care citește un șir de n numere naturale din intervalul [0,10000] și un număr k și determină:

lungimea maximă a unui platou care poate să apară în şir în urma efectuării operaţiunii de mai sus de maxim k ori elementul din care este format platoul obținut după cele k operațiuni

Date de intrare[edit | edit source]

Programul va citi:

  • pe prima linie un număr natural k;
  • pe a doua linie un număr natural n;
  • pe a treia linie un şir de n numere naturale separate prin câte un spaţiu.
  • pe a patra linie p, care reprezinta cerința; p poate fi 1 sau 2

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul c, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".


Restricţii şi precizări[edit | edit source]

  • 1 ≤ n ≤ 1000000
  • 1 ≤ k ≤ 100
  • pentru cerința 1 – 50% din punctaj
  • pentru cerința 2 – 50% din punctaj
  • dacă sunt mai multe platouri de lungime maxima se va afișa cel mai mare considera cel format din valoarea cea mai mare

toate testele au soluție

Exemplu 1[edit | edit source]

Intrare
2
16
2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2
1
Ieșire
Datele sunt introduse corect.
4

Exemplu 2[edit | edit source]

Intrare
2
6
2 2 2 3 3 3
1
Ieșire
Datele nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2073 - PlatouK v2

def validate_input(k, n, arr):

   if not 1 <= k <= 100 or not 1 <= n <= 1000000:
       return False
   if len(arr) != n:
       return False
   for i in arr:
       if not 0 <= i <= 10000:
           return False
   return True


def find_longest_plateau(k, arr):

   n = len(arr)
   longest_plateau = 0
   plateau_element = -1
   for i in range(n):
       j = i + 1
       while j < n and arr[i] == arr[j]:
           j += 1
       plateau_len = j - i
       if plateau_len > longest_plateau:
           longest_plateau = plateau_len
           plateau_element = arr[i]
   return longest_plateau, plateau_element


def solve(k, n, arr):

   if not validate_input(k, n, arr):
       print("Datele nu corespund restrictiilor impuse.")
       return
   for i in range(k):
       plateau_len, plateau_element = find_longest_plateau(1, arr)
       if plateau_len == 0:
           break
       arr.remove(plateau_element)
       _, new_element = find_longest_plateau(1, arr)
       arr.insert(arr.index(new_element) + 1, plateau_element)
   plateau_len, plateau_element = find_longest_plateau(1, arr)
   print(plateau_len)


if __name__ == "__main__":

   k = int(input())
   n = int(input())
   arr = list(map(int, input().split()))
   p = int(input())
   if p == 1:
       solve(k, n, arr)
   else:
       print("Datele sunt introduse corect.")


</syntaxhighlight>

Explicatie Rezolvare[edit | edit source]

validare(n, k, sir, cerinta) - Aceasta este o funcție de validare care primește ca parametri: n - numărul de elemente din șir, k - numărul maxim de operații permise, sir - lista cu elemente din șir și cerinta - un intreg care specifica cerinta (1 sau 2). Funcția validează inputul și returnează True dacă valorile de intrare sunt corecte, altfel returnează False.

lungime_platou(platou) - Această funcție primește ca parametru un platou, adică o secvență formată din valori identice. Funcția calculează și returnează lungimea platoului, adică numărul de elemente care îl formează.

rezolva(sir, k) - Această funcție primește ca parametri: sir - lista cu elemente din șir și k - numărul maxim de operații permise. Funcția calculează lungimea maximă a unui platou care poate să apară în șir în urma efectuării operației de maxim k ori și elementul din care este format platoul obținut după cele k operații și returnează aceste valori.

main() - Aceasta este funcția principală a programului, care se execută atunci când rulăm scriptul. Funcția citeste input-ul de la utilizator, validează inputul și apoi calculează și afișează rezultatul.