一門武功可否傳承久遠並被髮揚光大,是要看緣分的。通常來講,師傅傳授給徒弟的武功總要打個折扣,因而越日後傳,弟子們的功夫就越弱…… 直到某一支的某一代忽然出現一個天分特別高的弟子(或者是吃到了靈丹、挖到了特別的祕笈),會將功夫的威力一會兒放大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
在一行中輸出全部得道者的功力總值,只保留其整數部分。題目保證輸入和正確的輸出都不超過1010。event
輸入樣例: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 }