您的位置:首页 > 其它

first-try-PAT(甲级)1004笔记记录(计算树叶跟着网上完成了但要记得复习呀)

2020-02-06 09:41 357 查看

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
见鹿JOY 发布了16 篇原创文章 · 获赞 0 · 访问量 221 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: