#include <bits/stdc++.h>
using namespace std;
const int maxn=1000011;
float level[maxn];
int special[maxn];
vector<int>v[maxn];//存放下一代要么就是存放得道着武功的放大倍数
int main()
{
int n;
float z,r;
memset(level,0,sizeof(level));
memset(special,0,sizeof(special));
cin>>n>>z>>r;
int k;
float sum=0;//最后得道者的功力
for(int i=0;i<n;++i)//遍历每个人的徒弟
{
cin>>k;
if(k==0)
{
special[i]=1;//这个人的徒弟比较特殊
int f;
cin>>f;
v[i].push_back(f);//存放放大倍数
}
else
{ for(int j=0;j<k;++j)
{
int num;
cin>>num;
v[i].push_back(num);
}
}
}
queue<int>q;
q.push(0);
level[0]=z;//祖师爷的功力
while(!q.empty())//类似层次遍历 不断地一层一层的确定武功
{
int p=q.front();
q.pop();
if(special[p])//如果这个人的徒弟特殊
{
sum+=level[p]*v[p][0];
}
else
{
for(int j=0;j<v[p].size();++j)//后面的都是它徒弟的编号
{
level[v[p][j]]=level[p]*(1-r*1.0/100);
q.push(v[p][j]);
}
}
}
cout<<int(sum);
return 0;
}
https://pintia.cn/problem-sets/994805046380707840/problems/994805059118809088
这题可以把问题 还原成一棵树 从师傅一直到徒弟 然后保存师徒关系 通过队列 去层次遍历 这样可以由父节点 确定同一层次子节点的功力值