PTA 4-5 家谱处理(建树做法)

该博客介绍了如何处理PTA上的4-5家谱问题,涉及家谱结构的建立以及通过输入样例和输出样例验证陈述语句的正确性。家谱中名字由不超过10个英文字母组成,且具有特定的缩进规则表示亲属关系。每个名字在家族中唯一,且陈述语句用于检验家谱关系的真实性。

输入格式:

名字的字符串由不超过10个英文字母组成。在家谱中的第一行给出的名字前没有缩进空格。家谱中的其他名字至少缩进2个空格,即他们是家谱中最早祖先(第一行给出的名字)的后代,且如果家谱中一个名字前缩进kkk个空格,则下一行中名字至多缩进k+2k+2k+2个空格。

在一个家谱中同样的名字不会出现两次,且家谱中没有出现的名字不会出现在陈述语句中。每句陈述语句格式如下,其中XY为家谱中的不同名字:

X is a child of Y
X is the parent of Y
X is a sibling of Y
X is a descendant of Y
X is an ancestor of Y


输出格式:

对于测试用例中的每句陈述语句,在一行中输出True,如果陈述为真,或False,如果陈述为假。

输入样例:

6 5
John
  Robert
    Frank
    Andrew
  Nancy
    David
Robert is a child of John
Robert is an ancestor of Andrew
Robert is a sibling of Nancy
Nancy is the parent of Frank
John is a descendant of Andrew

输出样例:

True
True
True
False
False
代码:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct node{
 int level;
 char name[15];
 struct node* left;  //儿子; 
 struct node* right;   //兄弟; 
};
int l;    
node* gen=(node*)malloc(
### 问题解析 PTA 7-5 “数油桶”问题要求根据给定的底层油桶数和层数,计算出所有层的油桶总数。每层的油桶数依次递减1,例如底层有 `a` 个油桶,第二层为 `a-1`,第三层为 `a-2`,依此类推,直到层数用完。最终需要将所有层的油桶数相加,得到总和。 此问题的核心在于如何高效地计算出油桶总数,可以采用循环方式逐层累加,也可以通过数学公式直接计算。 ### 代码实现 #### 方法一:使用循环逐层累加 该方法通过一个循环,逐层累加油桶数量,适用于数据范围较小的情况。例如输入 `7 4`,则计算 `7 + 6 + 5 + 4 = 22`。 ```c #include<stdio.h> int main() { int a, b, sum = 0; scanf("%d %d", &a, &b); for(int i = 0; i < b; i++) { sum += a; a--; } printf("%d\n", sum); return 0; } ``` #### 方法二:使用数学公式优化计算 观察油桶数的排列规律,发现每层油桶数构成一个等差数列,公差为 -1。等差数列的求和公式为: $$ S_n = \frac{n}{2} \times (a_1 + a_n) $$ 其中: - $ n $ 为项数(即层数) - $ a_1 $ 为第一项(即底层油桶数) - $ a_n $ 为第 $ n $ 项(即顶层油桶数) 根据公式,顶层油桶数为 $ a - (n - 1) $,因此总和可以表示为: $$ sum = \frac{n}{2} \times (a + (a - n + 1)) = \frac{n}{2} \times (2a - n + 1) $$ ```c #include<stdio.h> int main() { long long int bottom, height, sum; scanf("%lld %lld", &bottom, &height); sum = (bottom + (bottom - height + 1)) * height / 2; printf("%lld\n", sum); return 0; } ``` ### 优化与注意事项 - **数据类型选择**:当油桶数较大时,建议使用 `long long int` 类型,避免整数溢出问题[^2]。 - **时间复杂度**:循环方法的时间复杂度为 $ O(n) $,而数学公式方法的时间复杂度为 $ O(1) $,推荐使用公式法提升效率。 - **边界情况处理**:需确保输入的层数不超过底层油桶数,否则可能导致负数出现。若需要支持更复杂的输入校验,可增加条件判断。 ### 示例运行 输入: ``` 7 4 ``` 输出: ``` 22 ``` 解释: - 底层油桶数为 7,层数为 4- 每层油桶数依次为 7, 6, 5, 4- 总和为 $ 7 + 6 + 5 + 4 = 22 $。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值