PAT L2-020 功夫传人

https://pintia.cn/problem-sets/994805046380707840/problems/994805059118809088

一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹、挖到了特别的秘笈),会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”。

这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅);每位师傅可以带很多徒弟;并且假设辈分严格有序,即祖师爷这门武功的每个第i代传人只能在第i-1代传人中拜1个师傅。我们假设已知祖师爷的功力值为Z,每向下传承一代,就会减弱r%,除非某一代弟子得道。现给出师门谱系关系,要求你算出所有得道者的功力总值。

输入格式:

输入在第一行给出3个正整数,分别是:N(≤)——整个师门的总人数(于是每个人从0到N−1编号,祖师爷的编号为0);Z——祖师爷的功力值(不一定是整数,但起码是正数);r ——每传一代功夫所打的折扣百分比值(不超过100的正数)。接下来有N行,第i行(,)描述编号为i的人所传的徒弟,格式为:

K?i?? ID[1] ID[2] ? ID[K?i??]

其中K?i??是徒弟的个数,后面跟的是各位徒弟的编号,数字间以空格间隔。K?i??为零表示这是一位得道者,这时后面跟的一个数字表示其武功被放大的倍数。

输出格式:

在一行中输出所有得道者的功力总值,只保留其整数部分。题目保证输入和正确的输出都不超过1。

输入样例:

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

代码:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int N;
double Z, R;
int cnt = 0, root;
int large[maxn], see[maxn], vis[maxn], lar[maxn];
vector<int> v[maxn];
int depth[maxn];

double Pow(double a, int b) {
    double ans1 = 1.0;

    while(b) {
        if(b % 2) {
            ans1 = ans1 * a;
            b --;
        } else {
            a = a * a;
            b /= 2;
        }
    }
    return ans1;
}

void dfs(int st, int step) {
    if(v[st].size() == 0) {
        depth[st] = step;
        return ;
    }

    for(int i = 0; i < v[st].size(); i ++) {
        if(!vis[v[st][i]]) {
            vis[v[st][i]] = 1;
            dfs(v[st][i], step + 1);
            vis[v[st][i]] = 0;
        }
    }
}

int main() {
    memset(see, 0, sizeof(see));
    memset(vis, 0, sizeof(vis));
    scanf("%d%lf%lf", &N, &Z, &R);
    for(int i = 0; i < N; i ++) {
        int K, x;
        scanf("%d", &K);
        if(K == 0) {
            scanf("%d", &x);
            large[cnt ++] = i;
            lar[i] = x;
        } else {
            for(int k = 0; k < K; k ++) {
                scanf("%d", &x);
                see[x] = 1;
                v[i].push_back(x);
            }
        }
    }

    root = 0;
    while(see[root]) root ++;

    dfs(root, 0);

    double sum = 0;
    R /= 100;
    R = 1 - R;
    for(int i = 0; i < cnt; i ++) {
        int mi = depth[large[i]];
        sum += (Z * Pow(R, mi) * lar[large[i]]);
    }

    printf("%d\n", (int)sum);

    return 0;
}

  要用快速幂 否则会超时 哭唧唧 晚安安了

FH

原文地址:https://www.cnblogs.com/zlrrrr/p/10612024.html

时间: 2024-10-26 18:36:21

PAT L2-020 功夫传人的相关文章

L2-020. 功夫传人

一门武功能否传承久远并被发扬光大,是要看缘分的.一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹.挖到了特别的秘笈),会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”. 这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅):每位师傅可以带很多徒弟:并且假设辈分严格有序,即祖师爷这门武功的每个第i代传人只能在第i-1代传人中拜1个师傅.我们假

pta l2-20(功夫传人)

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805059118809088 题意:给定n个人,编号0-n-1,0为祖先,每个人有一个师傅,每次从师傅传功夫到徒弟时,功力值会削弱r,但可能会出现得道者,功力翻n倍,计算所有得道者功力值之和. 思路:因为计算功力值时要从祖先开始逐渐向下计算,所以我们需要存储每个人的徒弟,然后从上向下遍历即可,我这里用的是邻接表实现的,定义maxn个表头结点head,head[i

天梯赛练习(一)

L2-017. 人以群分 题意: 给定n个正整数,  然后分成规模相差尽可能接近的两类, 这两类之和相差要尽可能大 分析: 直接排序, 然后分成两部分即可 1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[123456]; 4 int sum(int l , int r){ 5 int ans = 0; 6 for(int i = l; i <= r; i++) ans += a[i]; 7 return ans; 8 }

loj#6072 苹果树(折半搜索,矩阵树定理,容斥)

loj#6072 苹果树(折半搜索,矩阵树定理,容斥) loj 题解时间 $ n \le 40 $ . 无比精确的数字. 很明显只要一个方案不超过 $ limits $ ,之后的计算就跟选哪个没关系了. 折半搜索排序来统计有i个果子是有用的情况下的方案数. 然后矩阵树求生成树个数,容斥乱搞. #include<bits/stdc++.h> using namespace std; template<typename TP>inline void read(TP &tar)

PAT 天梯赛真题集(L2、L3)

题意:求点权最大的最短路,输出最短路径条数.点权值.以及最大点权的路径. 做法:Dijstra求最短路,两步:1.找最小点:2.更新路径.这题的1不变,变的是2.在更新新路径的时候,如果找到更短的路径,那么更新点权.方案数:如果路径和最短路径一样,那么比较谁的点权大,更新为点权大的结果. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

签证-L1/L2

http://blog.sina.com.cn/s/blog_7664b7f70102uweb.html 14年4月我接到公司通知,要从MICROSTRATEGY中国研发中心内部transfer到美国总部,于是大查开启了美国小生活. 一切从准备签证开始. 我申请的是L1签证.同样是工作,如果是直接拿到美国公司offer,一般是要申请H1签证的.就工作者本身来说,L1还是H1其实区别不大,但是对于配偶来说就大不一样了,L1的配偶拿L2签证可以申请上学,也可以申请工作许可(EAD):H1的配偶可以申

Cisco基础(五):配置静态NAT、配置端口映射、配置动态NAT、PAT配置、办公区Internet的访问

一.配置静态NAT 目标: 随着接入Internet的计算机数量的不断猛增,IP地址资源也就愈加显得捉襟见肘.事实上,除了中国教育和科研计算机网(CERNET)外,一般用户几乎申请不到整段的C类IP地址.在其他ISP那里,即使是拥有几百台计算机的大型局域网用户,当他们申请IP地址时,所分配的地址也不过只有几个或十几个IP地址.显然,这样少的IP地址根本无法满足网络用户的需求. 在R1上配置静态NAT使192.168.1.1转换为61.159.62.131,192.168.1.2转换为61.159

NAT地址转换详解(静态NAT,端口映射,动态NAT,PAT)

NAT地址转换概述图 这一章我们将学习并实践,静态NAT地址转换,动态NAT地址转换, 端口映射,PAT端口多路复用 一.了解NAT的优缺点 二.NAT的工作原理 静态转换 (Static Translation)动态转换(Dynamic Translation)端口多路复用(Port Address Translation) 三.NAT的术语于转换表 NAT地址转换一种伪装,确保了地址的安全 如图: PC1第一件事情发出请求,先查询路由表,然后才会根据NAT表转换成公网地址,去访问外部网.源I

螳螂拳传人尹广福老先生介绍

螳螂拳及传人尹老师介绍 螳螂拳流传近四百年,是武术百花园中一枝奇葩,隶属于象形拳术,其仿螳螂之勇,猿猴之灵,特点突异,功法卓著,在技击和推手中更是彰显异采,别树一帜,同时也是健身祛病的良好方式之一,广泛受到人们的推崇和练习. 螳螂门推手传人尹广福先生,与祖国同岁,祖籍北京,古都人文汇粹,名家辈出,武术高手遍布各大公园. 尹广福老先生,目前是北京七星螳螂拳推手研究协会会长.国际功夫联合会推手专业委员会副主任.蓟门烟树功夫推手训练中心主任.北京青朴武学总顾问. 1969年在陕北坚持练习: 2016年