2073 - PlatouK v2: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/2073/platouk-v2 - PlatouK v2] ---- == Cerinţa == 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;...
 
Flaviu (talk | contribs)
No edit summary
Line 32: Line 32:


== Date de ieșire ==  
== Date de ieșire ==  
Programul va afisa lungimea maximă a unui platou care poate să apară în şir în urma efectuării celor două operaţiuni de maxim k ori sau elementul din care este format platoul.
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 ==
== Restricţii şi precizări ==
Line 47: Line 49:
: 1
: 1
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele sunt introduse correct.
: 4
: 4


Line 55: Line 59:


def citire_lista():
def citire_lista():
     k = int(input())
     try:
    n = int(input())
        k = int(input())
    lista = list(map(int, input().split()))
        n = int(input())
    p = int(input())
        lista = list(map(int, input().split()))
    return k, lista, p
        p = int(input())
 
        return k, lista, p
    except:
        print("Datele nu corespund restrictiilor impuse.")


def rezolva(k, lista):
def rezolva(k, lista):
     # calculam dictionarul frecventelor
     try:
    frecvente = {}
        # calculam dictionarul frecventelor
    for element in lista:
        frecvente = {}
        frecvente[element] = frecvente.get(element, 0) + 1
        for element in lista:
   
            frecvente[element] = frecvente.get(element, 0) + 1
    # gasim elementul cu cea mai mare frecventa
       
    max_frecventa = max(frecvente.values())
        # gasim elementul cu cea mai mare frecventa
    element_max_frecventa = max(k for k, v in frecvente.items() if v == max_frecventa)
        max_frecventa = max(frecvente.values())
   
        element_max_frecventa = max(k for k, v in frecvente.items() if v == max_frecventa)
    # calculam lungimea maxima a unui platou dupa k operatii
       
    lungime_maxima = min(max_frecventa + k, len(lista))
        # calculam lungimea maxima a unui platou dupa k operatii
    return lungime_maxima if p == 1 else element_max_frecventa
        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):
def valideaza(valoare):
     if isinstance(valoare, int):
     try:
        print(valoare)
        if isinstance(valoare, int):
    else:
            print("Datele sunt introduse corect.")
        print(*valoare)
            print(valoare)
 
        else:
            print("Datele sunt introduse corect.")
            print(*valoare)
    except:
        print("Datele nu corespund restrictiilor impuse.")


if __name__ == "__main__":
if __name__ == "__main__":
Line 88: Line 100:
     rezultat = rezolva(k, lista)
     rezultat = rezolva(k, lista)
     valideaza(rezultat)
     valideaza(rezultat)





Revision as of 19:00, 27 April 2023

Sursa: - PlatouK v2


Cerinţa

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

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

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

  • 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

Intrare
2
16
2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2
1
Ieșire
Datele nu corespund restricțiilor impuse.
Datele sunt introduse correct.
4

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 2073 - PlatouK v2

def citire_lista():

   try:
       k = int(input())
       n = int(input())
       lista = list(map(int, input().split()))
       p = int(input())
       return k, lista, p
   except:
       print("Datele nu corespund restrictiilor impuse.")

def rezolva(k, lista):

   try:
       # calculam dictionarul frecventelor
       frecvente = {}
       for element in lista:
           frecvente[element] = frecvente.get(element, 0) + 1
       
       # gasim elementul cu cea mai mare frecventa
       max_frecventa = max(frecvente.values())
       element_max_frecventa = max(k for k, v in frecvente.items() if v == max_frecventa)
       
       # 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__":

   k, lista, p = citire_lista()
   rezultat = rezolva(k, lista)
   valideaza(rezultat)


</syntaxhighlight>

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.

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