PATL2_020功夫传人

  • gl[i]表示第i个人的功力

    td[i]表示编号为i的徒弟们

    结构体DD 存放得道的人的编号和倍数

    用DD的结构数组dd存放所有得道的人的编号和倍数

    用队列求出所有人的功力

    在将所有得道的人的功力*倍数 相加 就可以了

     

    代码如下

     

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    int n;
    double gl[100001],startGL,r;    //gl[i]表示第i个人的功力 
    vector<int> td[100001]; //td[i]表示编号为i的徒弟们 

    struct DD{ //存放得道的人的编号的倍数
        int num;
        int bs;     
    }; 
    vector<DD> dd;

    void getAllGL();

    int main()
    {
        int k,t;
        double ans = 0;
        DD d;
        cin>>n>>startGL>>r;
        gl[0] = startGL;
        for(int i=0;i<n;i++){
            cin>>k;
            if(k==0){
                cin>>t;
                d.num = i;
                d.bs = t;
                dd.push_back(d);    
            }
            for(int j=0;j<k;j++){
                cin>>t;
                td[i].push_back(t);
            }
        }
        getAllGL();
        for(int i=0;i<dd.size();i++){
            ans += gl[dd[i].num] * dd[i].bs;
        }
        cout<<int(ans)<<endl;
        return 0;
    }

    void getAllGL(){
        queue<int> q;
        q.push(0);
        double glTemp; 
        while(!q.empty()){
            int t = q.front();
            q.pop();
            glTemp = gl[t];
            for(int i=0;i<td[t].size();i++){
                gl[td[t][i]] = glTemp * (1-r/100) ;
                q.push(td[t][i]);
            }
        }
        
    }
     

猜你喜欢

转载自blog.csdn.net/xiaoguapi99/article/details/87885395