L2-020. 功夫传人
参考博客
1 #include<vector>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 vector<int> child[100005]; //储存徒弟的容器
6
7 double z,r,sum;
8 double val[100005]; //判断是否得道者和储存得道者倍数
9
10
11 void f(int id,double w) //表示第id个人,w表示传承下来的功力值
12 {
13 if(val[id]){ //当倍数不为0,即是得道者,乘以倍数加到sum
14 sum=sum+w*val[id];
15 }else{
16 for(int i=0;i<child[id].size();i++){
17 f(child[id][i],w*r); //把每个徒弟往下递归,传授给徒弟的功力值为w*r
18 }
19 }
20 return ;
21 }
22 int main()
23 {
24 memset(val,0,sizeof(val)); //初始化部分
25 sum=0;
26
27 int n,m,k;
28 scanf("%d %lf %lf",&n,&z,&r);
29 r=(100-r)/100; //题目为削弱r%,所以直接替换掉了
30
31 for (int i = 0; i < n; i++) {
32 scanf("%d",&m); //m来判断是否为得道者
33
34 if (!m) { //得道者,所以倍数储存到val[]里
35 scanf("%lf",&val[i]);
36 }else{
37 for (int j = 0; j <m; j++) { //不是得道者,依序储存到child[]容器里
38 scanf("%d",&k);
39 child[i].push_back(k);
40 }
41 }
42 }
43
44 f(0,z); //递归遍历,从0号祖师爷开始,功力为z
45
46 printf("%d
",(int)sum); //保留整数输出
47
48 return 0;
49 }