3523 - John: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
== Cerinta ==
== Cerinta ==


Un canadian deține o firmă cu n muncitori. Fiecare din aceștia lucrează la m case, codificate prin numere naturale. Canadianul dorește să afle:
Un canadian deține o firmă cu '''n''' muncitori. Fiecare din aceștia lucrează la '''m''' case, codificate prin numere naturale. Canadianul dorește să afle:


:1) numărul maxim de muncitori care lucrează la aceeași casă
:1) numărul maxim de muncitori care lucrează la aceeași casă
Line 8: Line 8:
== Date de intrare ==
== Date de intrare ==


Programul citește de la tastatură numerele n, m, iar apoi n * m numere naturale. Primele m numere reprezintă indicii caselor la care lucrează muncitorul 1, următoarele m numere reprezintă indicii caselor la care lucrează muncitorul 2, …, ultimele m numere reprezintă indicii caselor la care lucrează muncitorul n.
Programul citește de la tastatură numerele '''n, m''', iar apoi '''n * m''' numere naturale. Primele '''m''' numere reprezintă indicii caselor la care lucrează muncitorul 1, următoarele '''m''' numere reprezintă indicii caselor la care lucrează muncitorul 2, …, ultimele m numere reprezintă indicii caselor la care lucrează muncitorul n.


== Date de iesire ==
== Date de iesire ==
Line 16: Line 16:
== Restrictii si precizari ==
== Restrictii si precizari ==


*n, m, numărul de case la care se lucrează sunt mai mici decât 1.001
*'''n, m''', numărul de case la care se lucrează sunt mai mici decât '''1.001'''
*cele n * m numere citite vor fi mai mici decât 1.000.000.001
*cele '''n * m''' numere citite vor fi mai mici decât '''1.000.000.001'''


== Exemplul 1 ==
== Exemplul 1 ==
Line 26: Line 26:
:3 4 5
:3 4 5
;Iesire
;Iesire
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:3
:3
:2
:2
Line 37: Line 37:
:-3 9 10.7
:-3 9 10.7
;Iesire
;Iesire
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def main():
def max_muncitori_pe_o_casa(numar_muncitori, indici_case):
     # Citirea datelor de intrare
     frecventa_case = {}
     n = int(input("Introduceti numarul de muncitori (n): "))
     for indice_casa in indici_case:
    m = int(input("Introduceti numarul de case (m): "))
        if indice_casa not in frecventa_case:
   
            frecventa_case[indice_casa] = 0
    # Initializarea dicționarului
        frecventa_case[indice_casa] += 1
    lucratori_casa = {}


     # Citirea indiciilor caselor pentru fiecare muncitor
     return max(frecventa_case.values())
    for i in range(1, n + 1):
        indici_casa = [int(input(f"Introduceti indicii caselor pentru muncitorul {i}: ")) for _ in range(m)]
        lucratori_casa[i] = indici_casa


    # Cerința 1: Numărul maxim de muncitori care lucrează la aceeași casă
def max_case_cu_muncitori(n, m, indici_case_muncitori):
     max_muncitori_pe_casa = max(len(set(indici)) for indici in zip(*lucratori_casa.values()))
     frecventa_case = {}
    print(f"Numarul maxim de muncitori care lucreaza la aceeasi casa este: {max_muncitori_pe_casa}")
    for indici_case in indici_case_muncitori:
        for indice_casa in indici_case:
            if indice_casa not in frecventa_case:
                frecventa_case[indice_casa] = 0
            frecventa_case[indice_casa] += 1


     # Cerința 2: Numărul maxim de case la care lucrează simultan cel puțin doi muncitori
     numar_maxim_case = 0
    case_lucrate_de_mai_mult_de_un_muncitor = sum(1 for indici in zip(*lucratori_casa.values()) if len(set(indici)) > 1)
    for frecventa in frecventa_case.values():
     print(f"Numarul maxim de case la care lucreaza simultan cel putin doi muncitori este: {case_lucrate_de_mai_mult_de_un_muncitor}")
        if frecventa >= 2:
            numar_maxim_case += 1
 
    return numar_maxim_case
 
def verificare_date_intrare(n, m, indici_case_muncitori):
    if not (1 <= n <= 1000) or not (1 <= m <= 1000):
        return False
    for indici_case in indici_case_muncitori:
        if len(indici_case) != m or not all(1 <= indice <= 1000000000 for indice in indici_case):
            return False
    return True
 
# Citire date de intrare
n = int(input("Introduceți numărul de muncitori (n): "))
m = int(input("Introduceți numărul de case (m): "))
 
indici_case_muncitori = []
for i in range(n):
    indici_casa_muncitor = list(map(int, input(f"Introduceți indicii caselor pentru muncitorul {i + 1}, separați prin spațiu: ").split()))
    indici_case_muncitori.append(indici_casa_muncitor)
 
# Verificare date de intrare
if not verificare_date_intrare(n, m, indici_case_muncitori):
    print("Datele introduse nu corespund restricțiilor impuse")
else:
    # Calcul și afișare rezultate
    max_muncitori_pe_o_casa_result = max_muncitori_pe_o_casa(n, indici_case_muncitori[0])
    max_case_cu_muncitori_result = max_case_cu_muncitori(n, m, indici_case_muncitori)
 
    print(f"Numărul maxim de muncitori care lucrează la aceeași casă este: {max_muncitori_pe_o_casa_result}")
     print(f"Numărul maxim de case la care lucrează simultan cel puțin doi muncitori este: {max_case_cu_muncitori_result}")


if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:25, 29 December 2023

Cerinta[edit | edit source]

Un canadian deține o firmă cu n muncitori. Fiecare din aceștia lucrează la m case, codificate prin numere naturale. Canadianul dorește să afle:

1) numărul maxim de muncitori care lucrează la aceeași casă
2) numărul maxim de case la care lucreaza simultan cel putin doi muncitori

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele n, m, iar apoi n * m numere naturale. Primele m numere reprezintă indicii caselor la care lucrează muncitorul 1, următoarele m numere reprezintă indicii caselor la care lucrează muncitorul 2, …, ultimele m numere reprezintă indicii caselor la care lucrează muncitorul n.

Date de iesire[edit | edit source]

Programul va afișa pe ecran raspunsurile la cele două cerințe.

Restrictii si precizari[edit | edit source]

  • n, m, numărul de case la care se lucrează sunt mai mici decât 1.001
  • cele n * m numere citite vor fi mai mici decât 1.000.000.001

Exemplul 1[edit | edit source]

Intrare
3 3
1 2 3
2 3 4
3 4 5
Iesire
Datele introduse corespund restrictiilor impuse
3
2

Exemplul 2[edit | edit source]

Intrare
3 3
5.2 100 7.9
0 2 17
-3 9 10.7
Iesire
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def max_muncitori_pe_o_casa(numar_muncitori, indici_case):

   frecventa_case = {}
   for indice_casa in indici_case:
       if indice_casa not in frecventa_case:
           frecventa_case[indice_casa] = 0
       frecventa_case[indice_casa] += 1
   return max(frecventa_case.values())

def max_case_cu_muncitori(n, m, indici_case_muncitori):

   frecventa_case = {}
   for indici_case in indici_case_muncitori:
       for indice_casa in indici_case:
           if indice_casa not in frecventa_case:
               frecventa_case[indice_casa] = 0
           frecventa_case[indice_casa] += 1
   numar_maxim_case = 0
   for frecventa in frecventa_case.values():
       if frecventa >= 2:
           numar_maxim_case += 1
   return numar_maxim_case

def verificare_date_intrare(n, m, indici_case_muncitori):

   if not (1 <= n <= 1000) or not (1 <= m <= 1000):
       return False
   for indici_case in indici_case_muncitori:
       if len(indici_case) != m or not all(1 <= indice <= 1000000000 for indice in indici_case):
           return False
   return True
  1. Citire date de intrare

n = int(input("Introduceți numărul de muncitori (n): ")) m = int(input("Introduceți numărul de case (m): "))

indici_case_muncitori = [] for i in range(n):

   indici_casa_muncitor = list(map(int, input(f"Introduceți indicii caselor pentru muncitorul {i + 1}, separați prin spațiu: ").split()))
   indici_case_muncitori.append(indici_casa_muncitor)
  1. Verificare date de intrare

if not verificare_date_intrare(n, m, indici_case_muncitori):

   print("Datele introduse nu corespund restricțiilor impuse")

else:

   # Calcul și afișare rezultate
   max_muncitori_pe_o_casa_result = max_muncitori_pe_o_casa(n, indici_case_muncitori[0])
   max_case_cu_muncitori_result = max_case_cu_muncitori(n, m, indici_case_muncitori)
   print(f"Numărul maxim de muncitori care lucrează la aceeași casă este: {max_muncitori_pe_o_casa_result}")
   print(f"Numărul maxim de case la care lucrează simultan cel puțin doi muncitori este: {max_case_cu_muncitori_result}")


</syntaxhighlight>

Explicatie[edit | edit source]

Toți cei 3 muncitori lucrează la casa 3. Intersecția dintre oricare 2 muncitori este mai mică sau egală cu 2.