0653 – Firmă1

From Bitnami MediaWiki

Cerința[edit | edit source]

Într-o firmă sunt n angajați, numerotați de la 1 la n, organizați ierarhic, astfel că fiecare angajat are un șef direct, cu excepția directorului general, care nu are șef. Fiecare angajat al firmei are un salariu cunoscut, exprimat printr-un număr natural. În firmă funcționează un sistem de recompensare a angajaților astfel încât câștigul fiecărui salariat este egal cu salariul său la care se adaugă media aritmetică a câștigurilor subordonaților săi direcți. Excepție fac angajații care nu au subordonați direcți, pentru care câștigul este egal cu salariul.

Determinați care este câștigul directorului general al firmei.

Date de intrare[edit | edit source]

Fișierul de intrare firma1IN.txt conține pe prima linie numărul de angajați n.

Pe linia a doua se află n numere naturale, reprezentând structura ierarhică a firmei: al k-lea număr din șir precizează care este șeful direct al angajatului cu numărul de ordine k. Pentru directorul general valoarea corespunzătoare este 0.

Linia a treia conține, în ordine, salariile celor n angajați.

Date de ieșire[edit | edit source]

Fișierul de ieșire firma1OUT.txt va conține pe prima linie numărul C, reprezentând câștigul directorului general.

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

  • 1 ≤ n ≤ 100
  • salariul fiecărui angajat este un număr natural nenul cel mult egal cu 1000
  • media aritmetică a câștigurilor subordonaților fiecărui angajat se aproximează prin adaos, astfel încât să fie număr natural

Exemplul 1[edit | edit source]

firma1IN.txt:

8

4 3 0 3 2 1 2 1

2 6 4 3 7 3 1 5

firma1OUT.txt:

14

Exemplul 2[edit | edit source]

firma1IN.txt:

101

4 3 0 3 2 1 2 1

2 6 4 3 7 3 1 5

Output:

Input necorespunzator

Rezolvare[edit | edit source]

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

   if 1>n or 101<=n:
       return False
   for i in range(len(v)):
       if v[i] < 0 or v[i] > 1000:
           return False
   return True

n = 0 t = [0] * 105 salariu = [0] * 105 castig = [0] * 105

def dfs(k):

   global castig
   s = 0
   cnt = 0
   for i in range(1, n + 1):
       if t[i] == k:
           dfs(i)
           cnt += 1
           s += castig[i]
   if cnt > 0:
       if s % cnt == 0:
           s //= cnt
       else:
           s = s // cnt + 1
   castig[k] = s + salariu[k]

if __name__ == "__main__":

   with open("firma1IN.txt", "r") as fin:
       n = int(fin.readline())
       t[1:n+1] = map(int, fin.readline().split())
       salariu[1:n+1] = map(int, fin.readline().split())
       if not verificare(n, salariu):
           print("Input necorespunzator")
           exit()
   r = 0
   for i in range(1, n + 1):
       if t[i] == 0:
           r = i
   dfs(r)
   with open("firma1OUT.txt", "w") as fout:
       fout.write(str(castig[r]))

</syntaxhighlight>