0653 – Firmă1
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>