Rezolvare completă PbInfo #653 Firma1

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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Firma1:

#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("firma1.in");
ofstream fout("firma1.out");

int n , t[105], salariu[105] , castig[105];

void  dfs(int k)
{
    int s = 0, cnt = 0;
    for(int i = 1 ; i <= n ; ++i)
        if(t[i] == k)
        {
            dfs(i), cnt ++;
            s += castig[i];
        }
    if(cnt > 0)
    {
        if(s % cnt == 0)
            s /= cnt;
        else
            s = (int)(s/cnt) + 1;
    }
    castig[k] = s + salariu[k];
}

int main()
{
    fin >> n;
    for(int i = 1 ; i <= n ; i ++)
        fin >> t[i];
    for(int i = 1 ; i <= n ; i ++)
        fin >> salariu[i];
    int r = 0 ;
    for(int i = 1 ; i <= n ; i ++)
        if(t[i] == 0)
            r = i;
    dfs(r);
    fout << castig[r];
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #653 Firma1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #653 Firma1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!