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 firma1.in
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 firma1.out
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
Exemplu
firma1.in
8 4 3 0 3 2 1 2 1 2 6 4 3 7 3 1 5
firma1.out
14
#include <bits/stdc++.h> using namespace std; ifstream cin("firma1.in"); ofstream cout("firma1.out"); int n, d[101], c[101], r, p[101]; vector<vector<int>> G(101); queue<int> Q; void lee(){ while(!Q.empty()){ int x = Q.front(); bool ok = true; for(auto i:G[x]) if(!p[i]) ok = false; if(!ok){ Q.pop(), Q.push(x); continue; } if(!p[x]){ int sum=0, cnt=0; for(auto i:G[x]){ sum += c[i]; cnt++; } p[x] = 1; if(cnt > 0){ int s = sum / cnt; if(s * cnt != sum) s++; c[x] += s; } Q.push(d[x]); } Q.pop(); } cout << c[r]; } int main(){ cin >> n; for(int i = 1; i <= n; ++i){ cin >> d[i]; if(d[i] != 0) G[d[i]].push_back(i); else r = i; } for(int i = 1; i <= n; ++i) cin >> c[i]; for(int i = 1; i <= n; ++i){ int cnt = 0; for(auto j:G[i]) if(d[i] != j) cnt++; if(!cnt) Q.push(d[i]), p[i] = 1; } lee(); return 0; }