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