博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pta l2-20(功夫传人)
阅读量:6596 次
发布时间:2019-06-24

本文共 1038 字,大约阅读时间需要 3 分钟。

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805059118809088

题意:给定n个人,编号0~n-1,0为祖先,每个人有一个师傅,每次从师傅传功夫到徒弟时,功力值会削弱r,但可能会出现得道者,功力翻n倍,计算所有得道者功力值之和。

思路:因为计算功力值时要从祖先开始逐渐向下计算,所以我们需要存储每个人的徒弟,然后从上向下遍历即可,我这里用的是邻接表实现的,定义maxn个表头结点head,head[i]其中包括它的第一个徒弟编号nxt,翻的倍数,功力值;定义maxn个表结点,指向其兄弟结点。然后用dfs从祖先编号0开始搜即可,但我被两个细节点卡了一个多小时,卡到崩溃QAQ:1.输入的r是[0,100]的值,还需除100; 2. 我写代码没带脑子,在dfs函数中用全局变量tmp作为指向徒弟的指针,然后程序一直在那运行错误的结果...

AC代码:

1 #include
2 using namespace std; 3 4 const int maxn=100005; 5 struct node{ 6 int nxt,bg; 7 double gl; 8 }head[maxn]; 9 10 int n,k,tmp,nxt[maxn];11 double z,r,sum;12 13 void dfs(int p){14 if(head[p].bg)15 sum+=head[p].gl*head[p].bg;16 else{17 int t=head[p].nxt;18 while(t){19 head[t].gl=head[p].gl*r;20 dfs(t);21 t=nxt[t];22 }23 }24 } 25 26 int main(){27 scanf("%d%lf%lf",&n,&z,&r);28 r=1.0-0.01*r;29 head[0].gl=z;30 for(int i=0;i

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10573996.html

你可能感兴趣的文章
android脱壳之DexExtractor原理分析
查看>>
ERROR 1010 (HY000): Error dropping database (can't rmdir '.\kehuanedu_db', errno: 41)
查看>>
ASP.NET MVC---自定义HtmlHelper方法
查看>>
《构建之法》8、9、10章读后感
查看>>
中学数学
查看>>
Maximum Subarray II
查看>>
BNR Android Demo学习笔记(一)——CrimeIntent
查看>>
如何在 ASP.NET Core 中发送邮件
查看>>
jQuery ajax大数据量each输出 list
查看>>
Python基础之socket编程(Day29)
查看>>
雨燕权限管理前端技术总结
查看>>
Scala学习(五)练习
查看>>
自言自语
查看>>
【转载】十步完全理解SQL
查看>>
switch-case语句
查看>>
trim 函数
查看>>
java安装文件简介
查看>>
图像拼接 SIFT资料合集
查看>>
大道至简阅读笔记01
查看>>
第十周作业
查看>>