PAT1004

题目大意

给定一棵树,输出树的每一层叶子节点个数。

输入格式

第一行为N(0<N<100)-总节点个数,M(<N)-非叶节点个数。

后M行格式为ID K ID[1] ID[2] ... ID[K],id为非叶节点号,k为此节点具有的孩子节点个数,k后面为其孩子节点编号。

输出格式

输出为树的每一层叶子节点的个数,一行输出,空格隔开,行末无空格。

样例输入

2 1
01 1 02

样例输出

0 1

解题思路

此题考察点为dfs。

将每个节点的孩子节点编号存于vector,遍历每个非叶子节点,若此节点的vector为空,则为叶子节点,记录所在层数,将记录此层数的叶子节点数组数值增一。

全部代码

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 vector<int> v[100];
 7 int maxlevel = 0;
 8 int num[100] = { 0 };
 9 void dfs(int index, int level)
10 {
11     if (v[index].size() == 0) {
12         maxlevel = max(maxlevel, level);
13         num[level]++;
14         return;
15     }
16     for (int i = 0; i < v[index].size(); i++)
17         dfs(v[index][i], level + 1);
18 }
19 int main()
20 {
21     int n, m;
22     cin >> n;
23     if (n == 0) return 0;
24     cin >> m;
25     for (int i = 0; i < m; i++) {
26         int a, b;
27         cin >> a >> b;
28         for (int j = 0; j < b; j++) {
29             int t;
30             cin >> t;
31             v[a].push_back(t);
32         }
33     }
34     dfs(1, 0);
35     for (int i = 0; i <= maxlevel; i++) {
36         if (i == 0) cout << num[i];
37         else cout << ' ' << num[i];
38     }
39 }

 

转载于:https://www.cnblogs.com/komorabi/p/11224531.html

### 关于C语言PAT乙级1004题的解法与解析 对于PAT乙级1004题,题目描述涉及处理学生的信息记录。具体来说,程序需要接收一系列的学生数据,每条数据包括学生的姓名、学号以及成绩,并最终按照特定的要求输出这些信息。 #### 题目结构分析 根据给出的内容,在该类问题中,输入的第一行为正整数\(n\)表示后续会有\(n\)组学生信息待录入;而接下来的每一行则对应一位学生具体的个人信息——依次为姓名、学号和成绩[^5]。值得注意的是,这里的姓名和学号长度均不会超过十个字符,而且所有学生的成绩都是独一无二的。 #### 编程实现要点 为了高效完成此类任务,可以考虑如下几个方面: - **存储方式的选择**:由于涉及到对学生信息的操作(如查询最高分最低分的同学),因此推荐使用数组或者链表来保存每位同学的数据。 - **排序逻辑的设计**:当面对求取最值的需求时,可以直接遍历整个列表找到最大最小值对应的索引位置,也可以先对原始数据按一定规则排序后再选取首位元素作为目标对象。 - **格式化输出控制**:最后一步是要严格按照题目规定的格式打印结果,注意各字段间的间隔符及换行等问题。 下面是一个简单的代码框架用于解决这个问题: ```c #include <stdio.h> #include <string.h> typedef struct { char name[11]; char id[11]; int score; } Student; int main() { int n, i; scanf("%d", &n); Student students[n]; for(i = 0; i < n; ++i){ scanf("%s %s %d", students[i].name, students[i].id, &(students[i].score)); } // 找到分数最高的学生 int maxIndex = 0; for(i = 1; i < n; ++i){ if(students[maxIndex].score < students[i].score) maxIndex = i; } // 找到分数最低的学生 int minIndex = 0; for(i = 1; i < n; ++i){ if(students[minIndex].score > students[i].score) minIndex = i; } printf("%s %s\n%s %s\n", students[maxIndex].name, students[maxIndex].id, students[minIndex].name, students[minIndex].id); return 0; } ``` 上述代码实现了基本的功能需求,即读入多名学生的资料并找出其中得分最高者与最低者的相关信息加以展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值