1655 - Platou
Cerința[edit | edit source]
Fiind dat un şir de numere, denumim 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
şi4 4 4
ambele având lungimea3
; - platourile
7 7
(cel care începe în poziţia a patra) şi7 7
(cel care începe pe poziţia a zecea), ambele având lungimea2
; - platoul
3
care are lungimea1
.
În schimb nu avem platoul 7 7 7 7
deoarece cele patru elemente egale cu 7
nu sunt pe poziţii consecutive!
Se dă un şir de n numere. Fiecare dintre aceste numere aparţine intervalului [0,1000000]
. Asupra acestui şir se pot efectua o singură dată următoarele două operaţiuni în această ordine:
- 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 pentru un şir dat determină:
- Lungimea maximă a unui platou din şirul dat iniţial precum şi valoarea cea mai mare a elementelor care formează un platou de lungime maximă.
- Lungimea maximă a unui platou care poate să apară în şir în urma efectuării celor două operaţiuni precum şi valoarea cea mai mare a elementelor care ar putea forma un astfel de platou.
Date de intrare[edit | edit source]
Fișierul de intrare input.txt
conține:
- pe prima linie un număr natural
V
care poate avea valoarea1
sau valoarea2
; - pe a doua linie un număr natual
n
; - pe a treia linie un şir de
n
numere naturale separate prin câte un spaţiu, reprezentând elementele şirului dat. Fiecare dintre aceste numere aparţine intervalului[0,1.000.000]
.
Date de ieșire[edit | edit source]
Fișierul de ieșire output.txt
va conține:
- dacă
V=1
, atunci pe această linie se vor scrie cele două numere care reprezintă răspunsul la prima cerinţă. - dacă
V=2
, atunci pe această linie se vor scrie cele două numere care reprezintă răspunsul la a doua cerinţă.
Restricții și precizări[edit | edit source]
1 ≤ n ≤ 1.000.000
Exemplul 1[edit | edit source]
input.txt:
1
16
2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2
output.txt:
3 9
Explicație:
V=1
, deci se rezolvă NUMAI prima cerinţă. Lungimea maximă a unui platou din şirul dat este 3
. Sunt două astfel de platouri: 8 8 8
şi 9 9 9
. Valoarea cea mai mare din care este format unul dintre aceste platouri este 9
.
Exemplul 2[edit | edit source]
input.txt:
2
16
2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2
output.txt:
4 8
Explicație:
V=2
, deci se rezolvă NUMAI a doua cerinţă. În urma executării celor două operațiuni pot să apară platouri de lungime maximă 4
în două moduri: 2 2 2 2
respectiv 8 8 8 8
.
Valoarea cea mai mare din care este format unul dintre aceste platouri este 8
.
Exemplul 3[edit | edit source]
input.txt:
2
999999999999999
2 2 5 0 5 8 8 8 4 9 9 9 0 8 2 2
Output:
Input-ul nu convine conditiilor
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verificare(n):
if not(1<=n<=1000000): print("Input-ul nu convine conditiilor") exit()
with open("input.txt", "r") as fin, open("output.txt", "w") as fout:
v = int(fin.readline()) n = int(fin.readline()) verificare(n)
l=list(map(int, fin.readline().split()))
if v == 1: x = l[0] lcrt = 1 lmax = 1 valmax = x
for i in range(0,n - 1): y = l[i] if x == y: lcrt += 1 else: lcrt = 1
if lcrt > lmax: lmax = lcrt valmax = x elif lmax == lcrt and x > valmax: valmax = x
x = y
fout.write(f"{lmax} {valmax}\n") else: x = l[0] lcrt = 1 max1 = [0] * 1000002 max2 = [0] * 1000002
for i in range(0,n - 1): y = l[i] if x == y: lcrt += 1 else: if lcrt >= max1[x]: max2[x] = max1[x] max1[x] = lcrt elif lcrt > max2[x]: max2[x] = lcrt lcrt = 1
x = y
if lcrt >= max1[x]: max2[x] = max1[x] max1[x] = lcrt elif lcrt > max2[x]: max2[x] = lcrt
rezmax = 0 valmax = 0 for i in range(1000001, -1, -1): if max1[i] + max2[i] > rezmax: rezmax = max1[i] + max2[i] valmax = i
fout.write(f"{rezmax} {valmax}\n")
</syntaxhighlight>