- 博客(53)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 PAT甲级——萌新自学路程指导(胡扯的)
PAT语言选择没有之一,只有c++为什么?1.其他语言都没c++效率高(你也不想全对的代码卡在时间上通不过吧)2.效率差不多的,编写效率比不上c++(特指某c,造的轮子太多)PAT自学路程基础C语言 翁恺老师的课*能给你讲底层原理的c老师已经不多了 ***出师标准:**这一章“基本”看懂会基本指针,地址,递归用法编过至少10道涵盖以上内容的题目追加课程(感兴趣学)C++课程 周强老师C++课程 崔毅东老师进阶唯一指定 神课:数据结构实战课程 周强老师原因:当场教你写,手把
2020-05-28 01:11:32
650
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 PAT-OJ系统的一些细节
用全部头文件#include<bits/stdc++.h>和用专门的头文件并不会影响时间注释也几乎不会影响时间但是多次提交发现,影响时间的是服务器之间的差距
2020-05-25 03:35:25
531
1
原创 Dijkstra算法——基本原理 + 各部分本质及其衍生操作
Dijkstra背景Dijkstra是研究单源 最短 路径长度的算法且 边长度/权值 不能有负数注:且大部分题目都以无向边形式呈现Dijkstra原理解析Dijkstra的思路是更新2个表,其中有mark:标记点是否被访问过 path:走到每个点的权值/路径 其他追加记录:可访问表(略)写法上Dijkstra有3个模块;模块0:设定初始状态1、visit设定全false 2、path设定全为INT_MAX,起始点为03、定义 每次访问的点;最小路经...
2020-07-23 13:56:55
721
原创 1137 Final Grading——结构体set的比较函数+隐式散列思想+四舍五入小技巧
分析大致思路是:输入+处理1;输出+处理2粗处理:注意找到数组最大的边界赋值-1给期中成绩(在线和期末是不需要,原因是在输入时已经筛选了)处理1:输入时;根据输入给的顺序(在线,期中)进行筛选在输入期末时,此时同时计算总评,并插入set进行排序处理2:判断是否总评大于60输出按照期末的递减顺序;若相同,则按照学生id升序排列其他四舍五入:通过对结果+0.5,以保证截断时为四舍五入cmp比较函数必须写到struct中去,同时内部用operati.........
2020-07-21 23:10:29
114
原创 1165 Block Reversing——链表题的通解:隐式散列+用二维数组分块
同类型基础题1161-Merging Linked Lists进阶题——分块题1133 Splitting A Linked List分析设置3个下标完全对应的数组(构建隐式散列) 为了快速获得下标,构建map映射 地址——》下标 由于无法获得二维数组恰好的层数,因此采取尽可能大的策略(块3 9/3=3层 10/3=3则需要4层) 层数=quantity/block+1;这样无论如何都不会超出边界 插入二维数组时,按照 块满 ,则层数+1 的方式来累进摆放 同时对于 .....
2020-07-21 13:14:59
250
原创 1166 Summit——简单图论
分析Area 1 is OK.——》任意一个点都与剩下点相连;且无剩余点与这些点都相连Area 5 may invite more people, such as 3.——》任意一个点都与剩下点相连 且有剩余点;找到最小的剩余点Area 6 needs help.——》存在1个点与剩下点不相连代码#include<bit...
2020-07-21 12:54:32
316
原创 1164 Good in C——筛选字母和字符串矩阵的整行输出
分析将字符串 存放如 7*26的string的二维数组 由于最后的句子 是根据 每个char来找到二维数组中的对应字母 因此用map映射 char和 i (i*7) 由于cout无法识别空格等字符串,因此用getline读入一整行 1层遍历:每个单词 2层遍历:按照7列输出 3层遍历:单词中的字母其他筛选、输出格式 具体看代码代码#include<bits/stdc++.h>using namespace std;vector< vecto...
2020-07-21 12:39:30
464
原创 1167 Cartesian Tree——建树和层序遍历
分析给出小顶堆的中序,输出层序因此只需要每次找出序列中最小的,即为父结点代码#include<bits/stdc++.h>using namespace std;struct Tree { int key; Tree* lchild,* rchild; Tree(int x) { key = x; lchild = rchild = NULL; }};int quantity;vector<int>heap_ordered;...
2020-07-21 12:16:05
248
原创 1139 First Contact ——和柳神差不多快,但我比她空间占用更少
分析给出关系网;给出任意2个人,得到各自2个同性朋友,且这2个人之间也是朋友进一步分析由于存在 -0000 和 0000 必然用string,因此用到map 建立邻接表 其次由于需要 判断2个人之间也是朋友——》相连为了达到更好的时间效率,因此用map+set建图(别问我怎么知道map+vector不行的)同性判断,因此也只需比较string的长度即可输出时:要求是去绝对值,因此用substr进行截断 其次要求第一个升序,相同时,第二个也升序 因此采用map+set自身有序
2020-07-19 01:24:42
202
原创 1140 Look-and-say Sequence——非字符串做法(很一般的做法)
分析遍历序列,记录 连续 相同的数字生成下一个序列(记录 连续 相同的数字)直到递归次数为n具体来说递归由于是参照上一个序列,生成下一个序列,同时作为下一次递归的“参照”所以需要2个vector,递归时交换次序搜索由于数字是固定【0,9】,因此做个数表,找连续 相同的数字,就从数表里搜索其他注意由于不知道最终的序列长度是多少,因此设为尽可能长在测试下,至少要100000(反正我从1000开始测试,测试点6过不去,100000可以)代码#inclu..
2020-07-18 14:27:14
121
原创 1145 Hashing - Average Search Time——没有必要为了“短”,降低代码可读性
看了网上太多的答案,大多也是柳神那个版本出来的;讲真那个版本真的适合初学者吗?或许考试这么写没问题,但是丧失了可读性,个人觉得并不是什么“好代码”分析即代码模拟 二次冲突下的散列插入:位置=值%表长+i^2此时位置需落在【0,表长-1】,且插入位置有空间插入搜索搜索时仍需按照二次冲突的方式来遍历直到 比较到 相同值,跳出;或者达到循环上限跳出注:题目是Average Search Time是比较次数,与asl还是不一样的具体实现由于插入和搜索都需要二次冲突来遍历.
2020-07-17 14:37:31
131
原创 1144 The Missing Number——散列暴力法
分析数字范围是int;数字数量为10^5;求未给出的最小正整数声明数组空间:10^5+5情况1:数字大小全部在10^5内,直接遍历一遍即可撑死大小也就是10^5+1情况2:数字大小有在10^5 2侧,排除掉2侧的进行遍历此时10^5内必然有更多间隙代码#include<bits/stdc++.h>using namespace std;int quantity;vector<int>hash_table(100005);int m.
2020-07-16 14:35:39
112
原创 1147 Heaps——堆判断和静态树后序遍历
分析堆判断部分:参照1155 Heap Paths——DFS堆后序的遍历:形式上与树的后序遍历相同,只不过这里动的是“数组的指针”代码#include<bits/stdc++.h>using namespace std;int times, quantity;bool first{ true };vector<int>sequence;void InPut();void Judge();void Print(int);int main() {
2020-07-16 12:27:46
178
原创 1149 Dangerous Goods Packaging——优化时间:set剪枝做法
柳神的处理思路是用散列思想分析给出不合适的货物,要求从给出的各块中判断是否存在不合适货物不合适的货物:建图保存注:此题的不合适货物没有传递性,因此不需要dfs,直接判断即可判断:需要2轮遍历,时间复杂度为n^2(n为货物数量)原因:必须等到货物全部给出才能遍历,不能边给边判断因此剪枝思路是 缩小n的大小货物其中 有合适和不合适货物,因此把合适货物(不在图中的剪掉)具体做法用set的非重复性剪掉代码#include<bits/stdc++.h>#in
2020-07-15 16:32:06
119
原创 1155 Heap Paths——DFS
感觉网上太多答案都是完全参考柳神的版本。。。柳神dfs部分可读性其实很一般出彩的是判断大顶堆和小顶堆,非堆的思路,这很值得借鉴分析DFS原理:参考这篇PAT 1130 Infix Expression——什么才是DFS?由“柳神遍历”写法引发的思考判断部分:排除法思路初始化小顶堆和大顶堆为true;一点点排除,发现一个不是则为false原因:小顶堆、大顶堆、非堆三者相互独立我一开始思路:设定2个flag判断 是小顶堆、是大顶堆,来进行前后比较是无法应对来回变化的,..
2020-07-15 15:55:56
109
原创 PAT 1151 LCA in a Binary Tree——原理很简单,处理起来很麻烦
分析找得到LCA of 2 and 6 is 3.8 is an ancestor of 1.找不到ERROR: 9 is not found.ERROR: 12 and -3 are not found.找不到——》任意前序/中序搜索即可找得到:LCA of 2 and 6 is 3.分析中序可知:祖先3必在2,6中间分析前序可知:祖先3必在2,6前面因此同时满足上述2点,则说明能找到祖先当不满足时,则说明情况为8 is an ancestor of 1
2020-07-14 00:31:08
122
原创 PAT 1150 Travelling Salesman Problem——又是题目表意不清楚
最快解法还行的解法#include<bits/stdc++.h>#pragma warning(disable:4996)#pragma warning(disable:4703)#pragma warning(disable:4700)using namespace std;unsigned int vertex, edge, quantity, pairs, id, min_id, min_dist{ INT_MAX };int x, y, z, first;.
2020-07-13 15:17:28
109
原创 PAT 1154 Vertex Coloring——简单图论
分析大致题意:给出图,并给图中的点上色若有2个点相同颜色,则no若无,则输出颜色数量进一步分析查找是否有相同颜色:图的遍历颜色数量:用set不可重复的特性保存颜色代码#include<bits/stdc++.h>using namespace std;int vertex, edge, quantity;bool flag;vector<int>* graph;bool Judge() { int x; map<int,.
2020-07-13 13:13:42
101
原创 PAT 1146 Topological Order——考察拓扑题的思想
题目分析代码#include<bits/stdc++.h>using namespace std;vector<int>print, * graph;int vertex, edge, quantity, x, y;bool Judge(vector<int>);int main() { scanf("%d %d", &vertex, &edge); vector<int> indegree;...
2020-07-12 23:01:03
110
原创 PAT 1143 Lowest Common Ancestor——不建树直接上
分析本题需要理清楚一些基础概念:LCA、BST、前序遍历本题的判断可分为2类:能找到: 8 is an ancestor of 7. LCA of 2 and 5 is 3.找不到: ERROR: 9 is not found. ERROR: 12 and -3 are not found.进一步分析:能找到LCA of 2 and 5 is 3.即意味 2和5前面存在一个数,介于2...
2020-07-11 16:46:53
148
原创 PAT 1130 Infix Expression——什么才是DFS?由“柳神遍历”写法引发的思考
常见遍历写法或者说书上一般的范例写法此处特指王道,天勤等考研递归写法void PrintTree(BiTree* T) { if (T) { PrintTree(T->lchild); PrintTree(T->rchild); printf("%d ", T->key); }}柳神遍历代码源地址:https://www.liuchuo.net/archives/3798string ans = dfs(root);string dfs(int root
2020-06-14 15:16:43
280
4
原创 递归版本的Dijkstra算法
一些细节1. 起点默认设置为5,可以自定义2. 并不需要传递起点,起点的初始化体现在dist[start] = 0;3. visit为最后的输出数组4.默认地点为正整数,因此设置mark0为truemark[0] = true; 因此sit作为下标,从1开始,来确定在visit的插入位置具体递归原理,自行理解;测试数据输入5 71 2 21 5 12 3 12 4 12 5 23 5 13 4 1输出5 1 3 2 4...
2020-06-09 19:54:26
425
原创 PAT 1151 LCA in a Binary Tree——与网上大部分解都不同
更快的解法建树中最快的解法#include<bits/stdc++.h>using namespace std;int pairs{ 0 }, quantity{ 0 }, x, y;vector<int>preorder, inorder;map<int, int>pre_id, in_id;void Judge(map<int, int>::iterator, map<int, int>::iterator, int, int
2020-06-06 03:05:55
158
原创 PAT 1143 Lowest Common Ancestor——与网上大部分解都不同
#include<bits/stdc++.h>using namespace std;int pairs{ 0 }, quantity{ 0 }, x, y;map<int, int>id;//值——下标vector<int>bst;void Judge(map<int, int>::iterator, map<int, int>::iterator);int main() { scanf("%d %d", &pairs,
2020-06-06 02:30:32
231
原创 PAT 1130——
#include<bits/stdc++.h>#pragma warning(disable:4996)#pragma warning(disable:4703)#pragma warning(disable:4996)using namespace std;typedef struct Tree {string key;int lchild;int rchild;}BiTree;string PrintTree(BiTree* T, vector<BiTree*>
2020-05-25 03:29:35
112
原创 前序+中序建树——(合理范围下)1.打印树到各个叶节点深度 2.打印由树根到叶子的每条路径
#include<bits/stdc++.h>#pragma warning(disable:4700)#pragma warning(disable:4996)#pragma warning(disable:4703)using namespace std;typedef struct node { int key; struct node* lchild, * rchild; node(int x) { key = x; lchild = rchild = NULL
2020-05-25 03:23:44
251
原创 PAT 1135 Is It A Red-Black Tree——糟糕的出题
题目代码#include<bits/stdc++.h>using namespace std;#define black 0#define red 1typedef struct node { int color; int key; struct node* lchild, * rchild; node(int x,int y) { key = abs(x); color = y; lchild = rchild = NULL; }}RBTree;int
2020-05-25 03:14:32
285
原创 PAT 1138 Postorder Traversal——全网最优解
代码#include<bits/stdc++.h>#pragma warning(disable:4700)#pragma warning(disable:4996)#pragma warning(disable:4703)using namespace std;int quantity{ 0 };vector<int>preorder;vector<int>inorder;void InPut();void PrintPostFirst(int
2020-05-25 02:54:16
228
原创 PAT 1086 Tree Traversals Again——手把手教你——(不建树)从先序,中序生成后序
题目地址讲讲3种遍历特点希望能耐心看看,理解下,对于所有的二叉树遍历会有不同的理解先序——》根左右——》打头那个一定是根结点中序——》左根右——》明确根可以区分左右后序——》左右根——》明确根,则旁边肯定是右树说了这么多?有啥用——例子...
2020-05-18 23:51:33
240
原创 PAT 1074 Reversing Linked List——双端队列解法
题目地址原始想法既然给定的序列是乱序的;但是输出要求顺序,再按块反转输出那么我为何不直接在读入的时候调整为顺序呢!具体思路读入1个结点后,剩下的结点,仅存在3种情况插在他前面,插在他后面,直接空置(放到另一个容器a里)由于存在空置,因此当输入最后一个时,对容器a进行遍历,再次插入,知道符合题意的首尾通过reverse进行块反转输出时第一个是特殊的,中间是有一定规律的,最后补上-1代码#include<bits/stdc++.h>using namespace st
2020-05-17 03:59:40
1567
原创 STL——vector,list,deque比较
vector 是一段连续的内存块deque 是多个连续的内存块list 是所有数据元素分开保存,可以任何两个元素没有连续。vector 的查询性能最好并且在末端增加数据也很好除非它重新申请内存段;适合高效地随机存储。list 插入、删除元素性能是最好的,而查询性能非常差;适合 大量地插入和删除操作而不关心随机存取的需求。是一个链表任何一个元素都可以是不连续的,但它都有两个指向上一元素和下一元素的指针deque 如果你需要随即存取又关心两端数据的插入和删除,那么deque 是最佳之选是介
2020-05-15 15:21:58
112
原创 10^5以下素数筛法——素数表法
素数表判断模块#include<bits/stdc++.h>using namespace std;vector<int> primeNumber = {//此处填写生成的素数表};bool JudgePrime(int n) { bool flag = false; for (int i : primeNumber){ if (i==n){ flag = true; return flag; } } return flag;}素数表生成
2020-05-14 00:45:48
521
原创 一定能让你理解的素数判断——根号版本改
代码bool IsPrime(int a) { for (int i = 2; i*i < a; i++) { if (a % i == 0) return false; } return true;}原理即若a存在余数(能被整除)则a=k*k则一定能被1……k中数整除即传统根号版本的变形,相对更简洁,更好记忆适用范围:玩玩就好,10^5更好办法直接上素数表对比土办法bool IsPrime(int a) { for (int i = 2; i < a; i++)
2020-05-14 00:34:41
376
原创 一定能让你理解的素数筛法——埃氏筛法和欧式筛法
先上代码埃氏筛法#include<bits/stdc++.h>using namespace std;//时间复杂度(nloglogn)//适用10^6下const int MAX = 1000000;void FindPrime(vector<int>& prime);int main() { vector<int>prime; FindPrime(prime); for (auto i : prime) printf("%d "
2020-05-13 16:06:21
1150
原创 深度解析范围for循环
饭前小点心代码范围for是C++11新引入的写法,适用于任何顺序容器,数组int main() { vector<int>a = { 0,1,2,3,4,5 }; for (auto i : a) { printf("%d ", i); } printf("\n"); int b[] = { 6,7,8,9,10 }; for (auto i : b) { printf("%d ", i); } printf("\n"); for (auto& i
2020-05-11 03:42:47
1457
原创 PAT Cartesian Tree(2019年冬季考试 )——由二叉排序树到笛卡尔树
原题A Cartesian tree is a binary tree constructed from a sequence of distinct numbers. The tree is heap-ordered, and an inorder traversal returns the original sequence. For example, given the sequence ...
2020-04-28 18:53:25
261
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人