2350 - grup

From Bitnami MediaWiki
Revision as of 23:58, 4 January 2024 by Miawinator (talk | contribs) (Pagină nouă: Ionel este pasionat de problemele cu șiruri de numere naturale. Pornind de la un șir dat, el numește grup un subșir de numere care se formează după criterii precizate. De aceasta dată, el alege două criterii: Criteriul 1: grupează numerele după prima lor cifră. De exemplu, numerele <code>231</code> și <code>2745</code> aparțin aceluiași grup deoarece ambele încep cu aceeași cifră (<code>2</code>). Criteriul 2: pune în același grup toate numerele care au...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Ionel este pasionat de problemele cu șiruri de numere naturale. Pornind de la un șir dat, el numește grup un subșir de numere care se formează după criterii precizate. De aceasta dată, el alege două criterii:

Criteriul 1: grupează numerele după prima lor cifră. De exemplu, numerele 231 și 2745 aparțin aceluiași grup deoarece ambele încep cu aceeași cifră (2).

Criteriul 2: pune în același grup toate numerele care au în componența lor aceleași cifre, indiferent de numărul de apariții a fiecărei cifre. De exemplu, numerele 234372 și 3224727 vor fi plasate în același grup deoarece în componența ambelor intră cifrele 2, 3, 4 si 7, și numai acestea.

Cerința[edit | edit source]

Scrieţi un program care, pentru un şir dat de n numere naturale, rezolvă următoarele cerințe:

  1. determină numărul minim dintre numerele aparținând celui mai numeros grup care se formează conform Criteriului 1. Dacă sunt mai multe grupuri cu număr maxim de elemente, se va determina numărul minim din grupul pentru care prima cifra este cea mai mică.
  2. determină numărul de elemente ale celui mai numeros grup care se formează conform Criteriului 2.

Date de intrare[edit | edit source]

Fișierul de intrare input.txt conţine pe prima linie două numere naturale n și c, separate printr-un spațiu. Valoarea lui c este 1 sau 2, în funcție de cerința problemei. Pe a doua linie se găsesc n numere naturale, 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 rezultatul cerut în funcție de cerința indicată în fișierul de intrare.

Restricții și precizări[edit | edit source]

  • 0 < n ≤ 10000
  • Valorile din șirul de intrare sunt numere naturale cu maxim 9 cifre.

Exemplul 1[edit | edit source]

input.txt:

7 1

73532 344 739 34343 34 735 23757

output.txt:

34

Explicație:

c = 1; Se formează următoarele grupuri:

G1: 73532, 739, 735 (încep cu cifra 7)

G2: 344, 34343, 34 (încep cu cifra 3)

G3: 23753 (începe cu cifra 2)

G1 si G2 au număr maxim de elemente (3) dar se va afișa minimul din grupul G2 (34).

Exemplul 2[edit | edit source]

input.txt:

7 2

73532 344 739 34343 34 433 23757

output.txt:

4

Explicație:

c = 2; Se formează următoarele grupuri:

G1: 73532, 23757 (cifrele 2, 3, 7, 5)

G2: 739 (cifrele 3, 7, 9)

G3: 344, 34343, 34, 433 (cifrele 3, 4)

G3 are numărul maxim de elemente (4)

Exemplul 3[edit | edit source]

input.txt:

999999999999999999 2

73532 344 739 34343 34 433 23757

Output:

Input-ul nu convine conditiilor

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare(n):

   if not(1<=n<=10000):
       print("Input-ul nu convine conditiilor")
       exit()

def prima_cifra(n):

   while n > 9:
       n //= 10
   return n

with open("input.txt", "r") as fin, open("output.txt", "w") as fout:

   n, optiune = map(int, fin.readline().split())
   verificare(n)
   NR = [0] * 11
   M = [1000000000] * 11
   a = [0] * 1025
   l=list(map(int, fin.readline().split()))
   if optiune == 1:
       for i in range(1, n + 1):
           x = l[i-1]
           c = prima_cifra(x)
           NR[c] += 1
           M[c] = min(M[c], x)
       x = NR[0]
       c = M[0]
       for i in range(1, 10):
           if NR[i] > x:
               x = NR[i]
               c = M[i]
           elif x == NR[i]:
               c = min(c, M[i])
       fout.write(str(c) + "\n")
   else:
       for i in range(1, n + 1):
           x = l[i-1]
           c = 0
           if x == 0:
               c = 1
           else:
               while x > 0:
                   c |= 1 << (x % 10)
                   x //= 10
           a[c] += 1
       x = a[0]
       for i in range(1, 1025):
           x = max(x, a[i])
       fout.write(str(x) + "\n")

</syntaxhighlight>