2179 - Max 3
Fie n
un număr natural nenul şi un şir de n
numere naturale nenule, fiecare număr din şir având cel mult 3
cifre. Şirul dat se „maximizează”
prin aplicarea următoarelor transformări:
T1: Fiecare număr y
din şir este înlocuit cu cel mai mare număr care se poate obţine prin aranjarea tuturor cifrelor lui y
. De exemplu, pentru y=102
, prin aranjarea cifrelor, se obţin numerele: 12, 21, 102, 120, 201, 210,
cel mai mare număr fiind 210
. Astfel, y
se va înlocui în şir cu numărul 210
.
T2: Se schimbă ordinea numerelor din şirul obţinut după aplicarea transformării T1
astfel încât numărul x
obţinut prin alipirea tuturor numerelor din şir, în ordinea în care apar după schimbare, să fie cel mai mare posibil.
De exemplu,pentru n=3
şi şirul: 12, 132, 102,
după aplicarea transformării T1
noul şir este format din numerele: 21, 321, 210
. Din acest şir, se pot obţine, prin schimbarea ordinii numerelor, următoarele 6
şiruri:
1) 21, 321, 210
;
2) 21, 210, 321
;
3) 321, 21, 210
;
4) 321, 210, 21
;
5) 210, 21, 321
;
6) 210, 321, 21
;
Numerele care rezultă prin alipirea numerelor din fiecare şir obţinut sunt:
1) 21321210
;
2) 21210321
;
3) 32121210
;
4) 32121021
;
5) 21021321
;
6) 21032121
.
După aplicarea transformării T2
, şirul „maximizat” este: 321, 21, 210
deoarece cel mai mare număr dintre cele 6
obţinute este x=32121210
.
Cerința[edit | edit source]
Scrieţi un program care să citească numărul natural nenul n
şi cele n
numere naturale nenule din şir şi care să determine:
a) cel mai mare număr m
din şirul de numere obţinut în urma aplicării transformării T1
;
b) numărul x
obţinut prin alipirea numerele din şirul „maximizat” rezultat în urma aplicării transformării T2
.
Date de intrare[edit | edit source]
Fişierul de intrare input.txt
conţine două linii. Pe prima linie este scris numărul natural nenul n
, iar pe a doua linie sunt scrise cele n
numere naturale nenule din şir, separate prin câte un spaţiu.
Date de ieșire[edit | edit source]
Fişierul de ieşire output.txt
va conţine:
− pe prima linie numărul natural m
, reprezentând cel mai mare număr din şirul de numere obţinut în urma aplicării transformării T1
;
− pe a doua linie numărul natural x
, reprezentând numărul obţinut prin alipirea numerelor din şirul „maximizat”, rezultat în urma aplicării transformării T2
.
Restricții și precizări[edit | edit source]
• Numărul n
este număr natural 2 ≤ n ≤ 3500
Exemplul 1[edit | edit source]
input.txt:
9
34 23 9 43 21 67 121 79 213
output.txt:
321
9977643433232121211
Explicație:
După aplicarea transformării T1
, şirul devine: 43, 32, 9, 43, 21, 76, 211, 97, 321
. Cel mai mare număr din acest şir este m=321
. După aplicarea transformării T2
, şirul maximizat este: 9, 97, 76, 43, 43, 32, 321, 21, 211
iar numărul x=9977643433232121211
Exemplul 2[edit | edit source]
input.txt:
9999999
34 23 9 43 21 67 121 79 213
Output:
Constrangeri neindeplinite
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def ver(n):
if not(2<=n<=3500): print("Constrangeri neindeplinite") exit()
def main():
with open("input.txt", "r") as f: n = int(f.readline().strip()) ver(n) v = [0] * 3502 maxi = -1 freq = [0] * 1000
for line in f: v = list(map(int, line.split()))
for i in range(0, n): aux = v[i] nrc = 0 nr = 0
while aux: nrc += 1 aux //= 10
cif = [0] * (nrc + 1) cnt = 0 aux = v[i]
while aux: cnt += 1 cif[cnt] = aux % 10 aux //= 10
cif[1:cnt+1] = sorted(cif[1:cnt+1])
while cnt: nr *= 10 nr += cif[cnt] cnt -= 1
v[i] = nr
if v[i] > maxi: maxi = v[i]
for i in range(0, n): freq[v[i]] += 1
with open("output.txt", "w") as g: g.write(str(maxi) + "\n")
for i in range(9, -1, -1): while freq[i]: g.write(str(i)) freq[i] -= 1
for j in range(i * 10 + 9, i * 10, -1): while freq[j]: g.write(str(j)) freq[j] -= 1
for k in range(j * 10 + 9, j * 10, -1): while freq[k]: g.write(str(k)) freq[k] -= 1
if __name__ == "__main__":
main()
</syntaxhighlight>