first-try-PAT(甲级)1004笔记记录(计算树叶跟着网上完成了但要记得复习呀)
first-try-PAT(甲级)1004笔记记录
1. 原题参照PAT官网
2. 生词记录
-
format: n. 格式;版式;开本; vt. 使格式化;规定…的格式; vi. 设计版式
-
two-digit number 两位数字
-
sake of simplicity 为了简单起见
- sake n. 目的;利益;理由;日本米酒
- simplicity n. 朴素;简易;天真;愚蠢 -
sequence n. [数][计] 序列;顺序;续发事件; vt. 按顺序排好
3. 知识点
-
vector 向量:是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
-
题解中解释说是利用vector进行存储、利用bfs进行搜索,book[ i ] 来记录每一层叶子节点的个数。vec[220]是一个动态的为每个非叶子结点创建一个动态序列,以用来存储它的叶子节点。
-
std::ios::sync_with_stdio(false);在C++中的输入和输出有两种方式,一种是scanf和printf,另一种是cin和cout,在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的。C++和C很相似,很多大佬都用C++写C,但是在后面的一种方式中cin和cout的输入和输出效率比第一种低,原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。
-
iostream默认是与stdio关联在一起的,以使两者同步,因此消耗了iostream不少性能。C++中的std :: cin和std :: cout为了兼容C,保证在代码中同时出现std :: cin和scanf或std :: cout和printf时输出不发生混乱,所以C++用一个流缓冲区来同步C的标准流。通过std :: ios_base :: sync_with_stdio函数设置为false后可以解除这种同步,让std :: cin和std :: cout不再经过缓冲区,iostream的性能就会提高了很多倍。因此,当解除同步之后,注意不要与scanf和printf混用以免出现问题。
4. 代码record
">#include<stdlib.h> #include<string> #include<queue> #include<stack> #include<iostream> #include<algorithm> using namespace std; #define MAXSIZE 30 #include<vector> using namespace std; int N, M, K, level[220], maxlevel, node; vector<int>vec[220]; int leaves_answer[220]; void bfs() { queue<int> queue1; //创建一个空队列用于计算广度遍历 queue1.push(1); //把根节点放进队列 while (!queue1.empty()) { //如果该层深度上的结点未被访问完 int q1, q2, q3; q1 = queue1.front(); //取出该层第一个数 queue1.pop(); maxlevel = max(level[q1], maxlevel);//随时计算最大深度 /*!!!!!!!!下面那段没看懂,我滚去复习bfs!!*/ if (vec[q1].size() == 0) { leaves_answer[level[q1]]++; } for (int i = 0; i < vec[q1].size(); i++) { queue1.push(vec[q1][i]); level[vec[q1][i]] = level[q1] + 1; } } } int main() { std::ios::sync_with_stdio(false); cin >> N >> M; for (int i = 0; i < M; i++) { cin >> node >> K; for (int j = 0; j < K; j++) { int tmpID; cin >> tmpID; vec[node].push_back(tmpID); ///vec是一个双重动态表,node表示有叶子的结点, ///在以其为名创建动态列表中,存储其下的叶子结点ID } } bfs(); //利用广度遍历算法,计算vec中的结点深度以及叶子。 //逐层输出leaves_answer 中的答案 for (int i = 0; i <= maxlevel; i++) { cout << leaves_answer[i]; if (i != maxlevel)cout << " "; else cout << endl; } return 0; }
代码学习的原文链接:https://blog.csdn.net/qq_37360631/article/details/88650203
- 点赞
- 收藏
- 分享
- 文章举报
- PAT甲级解题笔记1004-dfs/树的遍历
- PAT(甲级)1012笔记---复习排序去!!!
- 算法笔记学习&&PAT甲级解题记录
- PAT程序设计考题——甲级1004 遍历树节点(计算树每层的叶子节点数目)
- [复习记录] 浙大 PAT 甲级 1111 Online Map 带有等长路径选择策略的、用邻接矩阵实现的disktra算法 DFS
- PAT甲级1015笔记记录 测试点3未通过
- 【note】PAT甲级刷题笔记
- PAT甲级1001-1004
- PAT甲级1048记录
- 云计算复习笔记一
- PAT甲级 1004
- 在github上搭建ssm项目,记录轻笔记项目的完成进度
- 【C语言】PAT甲级训练题目 1004题总结
- PAT(甲级)1014笔记--银行业务问题
- PAT甲级 1004 树
- PAT(甲级)1013笔记---测试点0、2未通过
- 【JAVAWEB学习笔记】网上商城实战1:环境搭建和完成用户模块
- PAT甲级1001记录
- PAT甲级部分python解题记录
- PAT-甲级-1004