【校賽】求樹的各層結點的權值的平均值

關心員工(25)

Description

SLF是G市某集團的總裁,他認爲能一起打拼的員工都是好兄弟,因此他十分關心公司各個層次員工的生活水平。在公司中,每位員工都有且只有一名直屬上司(SLF除外),而上司有可能有多個下屬員工,於是各級員工之間就有了層次之分。爲了更好地給員工補貼,SLF會定期統計各層次員工的平均收入。由於SLF忙於處理集團事務,於是想請你幫忙編程解決這個問題。

Input

K   N_1   N_2  ...   N_K   SalaryK  N1​  N2​ ...  NK​  Salary輸入第一行中給出一個整數N(1 \leq N \leq 10^5)N(1≤N≤105),即整個公司的總人數,每個員工從1到N編號,總裁SLF的編號爲1。隨後N行,第i行給出編號爲i的員工的相關信息,格式如下:

K   N_1   N_2  ...   N_K   SalaryK  N1​  N2​ ...  NK​  Salary

其中K是一個整數(0 \leq K \leq20)(0≤K≤20),表示該員工直接下屬員工的個數,N_iNi​是直接下屬員工的編號,Salary是一個正數(Salary \leq 2*10^4)(Salary≤2∗104),表示該員工的收入。

Output

在一行中對應輸出公司的層次數m,隨後m行中輸出各層次員工的平均工資,格式爲”Level i: average_iaveragei​”(不含雙引號),其中average_iaveragei​表示第i層員工的平均工資,需要保留兩位小數。

Sample Input 1 

7
2 2 3 100
3 4 5 6 2
1 7 3
0 4
0 5
0 6
0 7

Sample Output 1

3
Level 1: 100.00
Level 2: 2.50
Level 3: 5.50

看這個題目時已經晚了。在20分以上的題,這道25分的題起碼有些想法。特麼我看着不會的題在那瞎想什麼,不會基本上再糾結也是浪費時間。賽後敲了一下代碼。

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

const int maxn=100005;
const int maxdepth=100005;  // 大小不確定,交了幾次,發現要這麼大才能AC

vector<int> g[maxn];
double w[maxn];
double sum[maxdepth]; 
int cnt[maxdepth];
int depth=-1;
int n;

// dfs(1, 1)
void dfs(int r, int level)
{
	sum[level]+=w[r];
	cnt[level]++;
	if(level>depth)
		depth=level;
	for(int i=0;i<g[r].size();i++)
		dfs(g[r][i], level+1);
}

int main()
{
	cin>>n;
	
	int i, j;
	for(i=1;i<=n;i++)
	{
		int cnt, t;
		cin>>cnt;
		for(j=0;j<cnt;j++)
		{
			cin>>t;
			g[i].push_back(t);
		}
		cin>>w[i];
	}
	dfs(1, 1);
	
	printf("%d\n", depth);
	for(i=1;i<=depth;i++)
		printf("Level %d: %.2lf\n", i, sum[i]/cnt[i]);
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章