L2-020 功夫傳人

L2-020. 功夫傳人

一門武功可否傳承久遠並被髮揚光大,是要看緣分的。通常來講,師傅傳授給徒弟的武功總要打個折扣,因而越日後傳,弟子們的功夫就越弱…… 直到某一支的某一代忽然出現一個天分特別高的弟子(或者是吃到了靈丹、挖到了特別的祕笈),會將功夫的威力一會兒放大N倍 —— 咱們稱這種弟子爲「得道者」。ide

這裏咱們來考察某一位祖師爺門下的徒子徒孫家譜:假設家譜中的每一個人只有1位師傅(除了祖師爺沒有師傅);每位師傅能夠帶不少徒弟;而且假設輩分嚴格有序,即祖師爺這門武功的每一個第i代傳人只能在第i-1代傳人中拜1個師傅。咱們假設已知祖師爺的功力值爲Z,每向下傳承一代,就會減弱r%,除非某一代弟子得道。現給出師門譜系關係,要求你算出全部得道者的功力總值。spa

輸入格式:code

輸入在第一行給出3個正整數,分別是:N(<=105)——整個師門的總人數(因而每一個人從0到N-1編號,祖師爺的編號爲0);Z——祖師爺的功力值(不必定是整數,但起碼是正數);r ——每傳一代功夫所打的折扣百分比值(不超過100的正數)。接下來有N行,第i行(i=0, ..., N-1)描述編號爲i的人所傳的徒弟,格式爲:blog

Ki ID[1] ID[2] ... ID[Ki]遞歸

其中Ki是徒弟的個數,後面跟的是各位徒弟的編號,數字間以空格間隔。Ki爲零表示這是一位得道者,這時後面跟的一個數字表示其武功被放大的倍數。string

輸出格式:it

在一行中輸出全部得道者的功力總值,只保留其整數部分。題目保證輸入和正確的輸出都不超過1010event

輸入樣例:
10 18.0 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3
輸出樣例:
404

直到某一支的某一代忽然出現一個天分特別高的弟子!!! 因此得道者必定出如今某一代的某個弟子 
 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)  
12 {
13     if(val[id])
14     {     
15         sum=sum+w*val[id];
16     }
17     else
18     {
19         for(int i=0; i < child[id].size(); i++)
20         {
21             f(child[id][i], w*r);             
22         }
23     }
24     return ;
25 }
26 int main()
27 {
28     memset(val,0,sizeof(val));     
29     sum=0;
30     
31     int n,m,k;
32     scanf("%d %lf %lf",&n,&z,&r);
33     r=(100-r)/100;                
34     for (int i = 0; i < n; i++) 
35     {
36         scanf("%d",&m);         
37         if (!m) 
38         {                
39             scanf("%lf",&val[i]);
40         }
41         else
42         {
43             for (int j = 0; j <m; j++) 
44             {   
45                 scanf("%d",&k);
46                 child[i].push_back(k);
47             }
48         }
49     }
50     f(0,z);       //遞歸遍歷,從0號祖師爺開始,功力爲z    
51     printf("%d\n",(int)sum);     //保留整數輸出
52 
53     return 0;
54 }
View Code
相關文章
相關標籤/搜索