0653 – Firmă1

De la Universitas MediaWiki

Cerința

Î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

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

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

  • 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

firma1IN.txt:

8

4 3 0 3 2 1 2 1

2 6 4 3 7 3 1 5

firma1OUT.txt:

14

Exemplul 2

firma1IN.txt:

101

4 3 0 3 2 1 2 1

2 6 4 3 7 3 1 5

Output:

Input necorespunzator

Rezolvare

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]))