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\n",(int)sum);     //保留整数输出
47 
48     return 0;
49 }