2976 - maxim7: Difference between revisions
No edit summary |
No edit summary |
||
Line 41: | Line 41: | ||
<code>maxim.in</code> | <code>maxim.in</code> | ||
2 | 2 | ||
10 3 | |||
7 2 8 1 0 0 4 7 8 1 | |||
<code>maxim.out</code> | |||
7 | |||
=== Explicație === | |||
Se rezolvă cerința <code>2</code>. Alegând cifrele începând de la poziția a <code>7</code>-a (cifrele <code>4</code>, <code>7</code> și <code>8</code>), se va forma numărul <code>874</code>, care este cel mai mare posibil. | |||
== Încărcare soluție == | |||
=== Lipește codul aici === | |||
<syntaxhighlight lang="python" line="1"> | <syntaxhighlight lang="python" line="1"> | ||
import array as arr | import array as arr | ||
Line 98: | Line 110: | ||
g.write(str(poz)) | g.write(str(poz)) | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
main() | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Latest revision as of 16:37, 31 January 2024
Dintr-un șir format din N
cifre, numerotate de la 1
la N
, Ionel ia exact M
cifre aflate pe poziții consecutive. El lipește cifrele luate sau le amestecă și apoi le lipește pentru a obține cu ele un număr cât mai mare.
Cerința[edit | edit source]
Cunoscând N
, M
și cele N
cifre din șir, să se determine:
1) cel mai mare număr care se poate obține din primele M
dintre cele N
cifre date;
2) de unde va lua Ionel M
cifre aflate pe poziții consecutive pentru a obține un număr maxim; dacă sunt mai multe poziții corespunzătoare unui număr maxim, alegerea se va face astfel încât numărul format din cifrele rămase, în ordinea în care erau, să fie cât mai mare posibil; dacă și în acest caz există mai multe soluții, se alege poziția maximă.
Date de intrare[edit | edit source]
Din fișierul maxim.in
se citesc: P
de pe prima linie, reprezentând cerința problemei (1
sau 2
), N
și M
de pe a doua linie, despărțite printr-un spațiu, cu semnificația din enunț, iar de pe linia a treia, se citesc cele N
cifre, despărțite prin câte un spațiu.
Date de ieșire[edit | edit source]
În fișierul maxim.out
se scrie:
- pentru P = 1
: numărul maxim care se poate obține cu ajutorul primelor M
cifre dintre cele N
date, fără spații între cifrele numărului;
- pentru P = 2
: un număr reprezentând poziția cerută.
Restricții și precizări[edit | edit source]
M
,N
numere naturale,1 ≤ N ≤ 500000
,1 ≤ M ≤ 1000
,M < N
- Cele
N
valori de pe linia a treia sunt numere naturale între0
și9
- Secvența de
N
cifre poate să înceapă cu cel multM - 1
cifre nule. 30
de puncte se vor obține cu rezolvarea cerinței1
, iar60
de puncte se vor obține cu rezolvarea cerinței2
.- Pentru
50%
dintre teste,N < 1000
șiM < 10
. - În concurs s-au acordat
10
puncte din oficiu. Aici se acordă pentru exemplele din enunț.
Exemplul 1:[edit | edit source]
maxim.in
1 10 3 7 2 8 1 0 0 4 7 8 1
maxim.out
872
Explicație[edit | edit source]
Se rezolvă cerința 1
. Cu primele trei cifre dintre cele 10
cifre date se pot forma numerele: 728
, 782
, 287
, 278
, 827
, 872
, cel mai mare fiind 872
.
Exemplul 2:[edit | edit source]
maxim.in
2
10 3 7 2 8 1 0 0 4 7 8 1
maxim.out
7
Explicație[edit | edit source]
Se rezolvă cerința 2
. Alegând cifrele începând de la poziția a 7
-a (cifrele 4
, 7
și 8
), se va forma numărul 874
, care este cel mai mare posibil.
Încărcare soluție[edit | edit source]
Lipește codul aici[edit | edit source]
<syntaxhighlight lang="python" line="1"> import array as arr
dim = 500008 v = arr.array('h', [0] * dim)
w = [0] * 10 W = [0] * 10
def main():
with open("maxim.in", "r") as f, open("maxim.out", "w") as g:
N, i, j, poz, M, x, z, k, ii = 0, 0, 0, 0, 0, 0, 0, 0, 0 ok = 1 p = int(f.readline())
input_data = f.readline().split() N = int(input_data[0]) M = int(input_data[1])
v[1:N+1] = map(int, f.readline().split())
for i in range(1, N+1): x = v[i] w[x] += 1
if p == 1: if w[0] == M: g.write("0") else: for j in range(9, -1, -1): for i in range(1, w[j]+1): g.write(str(j))
if p == 2: for j in range(10): W[j] = w[j]
for i in range(M+1, N+1): x = v[i] w[x] += 1 z = v[i-M] w[z] -= 1 ok = 1 for j in range(9, 0, -1): if W[j] != w[j]: if w[j] > W[j]: ok = 2 W = w[:] poz = i - M + 1 else: ok = 0 break if ok == 1: poz = i - M + 1
g.write(str(poz))
if __name__ == '__main__':
main()
</syntaxhighlight>