编写一个C++代码一门武功能否传承久远并被发扬光大是要看缘分的。一般来说师傅传授给徒弟的武功总要打个折扣于是越往后传弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子或者是吃到了灵丹、挖到了特别的秘笈会将功夫的威力一下子放大N倍 —— 我们称这种弟子为得道者。这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅除了祖师爷没有师傅;每位师傅可以带很多徒弟;
分析: 根据题目给出的师门谱系关系,可以使用深度优先搜索(DFS)来遍历整个家谱,计算得道者的功力总值。
具体实现步骤如下:
- 定义一个结构体Node,表示每个人的信息。包括一个bool类型的变量isDao,表示是否为得道者,一个double类型的变量power,表示武功的威力。
- 定义一个vector
类型的数组tree,用来存储家谱中每个人的信息。数组的下标代表人的编号。 - 定义一个递归函数dfs,用来遍历家谱中的每个人,并计算得道者的功力总值。函数的参数为当前遍历的人的编号。
- 如果当前人是得道者,则将其功力总值加到一个全局变量sum中。
- 如果当前人不是得道者,则遍历他的徒弟,计算他的功力值,并递归调用dfs函数。
- 在主函数中,按照输入格式读入数据,并构建家谱树。
- 调用dfs函数,遍历整个家谱,计算得到得道者的功力总值。
- 输出得道者的功力总值。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
struct Node {
bool isDao; // 是否为得道者
double power; // 武功威力
};
vector<Node> tree; // 家谱树
double sum = 0; // 得道者的功力总值
void dfs(int cur) {
if (tree[cur].isDao) { // 当前人是得道者
sum += tree[cur].power;
} else { // 当前人不是得道者
for (int i = 0; i < tree[cur].power; i++) {
dfs(cur + 1);
}
}
}
int main() {
int N;
double Z, r;
cin >> N >> Z >> r;
tree.resize(N);
for (int i = 0; i < N; i++) {
int K;
cin >> K;
if (K == 0) { // 得道者
tree[i].isDao = true;
cin >> tree[i].power;
} else { // 非得道者
tree[i].isDao = false;
tree[i].power = pow(r, K);
}
}
dfs(0);
cout << (int)sum << endl;
return 0;
}
复杂度分析: 由于需要遍历整个家谱,时间复杂度为O(N),其中N为师门的总人数。空间复杂度为O(N),用来存储家谱树的信息
原文地址: http://www.cveoy.top/t/topic/h5oB 著作权归作者所有。请勿转载和采集!