
PTA 团队天梯赛
给个选择
世界上只有10种人,一种懂二进制,一种不懂。
展开
-
7-2 Huffman Codes (30分)【完整思路+46行代码】
咳,对于不会建树也懒得建树的我。看到网上上百行建树的题解就头疼。所以我一直在想如何不建树AC掉这道题,还好。。没白花时间。。。首先要清楚哈夫曼编码的概念,我想能做L3的人底子应该不太差,哈夫曼的原理肯定都知道,我就不再赘述了。但是做这道题还是要知道哈夫曼编码的特征或者性质。1.编码后路径权值如何求? 其实哈夫曼编码类似于贪心,每次取最小和次最小的,将他俩合并。以此类推到最后全部合并完...原创 2020-03-01 11:50:12 · 811 阅读 · 2 评论 -
L2-014 列车调度 (25分)【17行极短代码】
#include<bits/stdc++.h>using namespace std;int n,x;set<int>s;int main(){ cin>>n>>x; s.insert(x); while(--n) { cin>>x; auto it=s.upper_bound(x); if(it!=s.e...原创 2020-02-20 09:45:59 · 615 阅读 · 0 评论 -
L2-013 红色警报 (25分)
#include<bits/stdc++.h>using namespace std;const int maxn=5050;int n,m,k,a,b,c,cnt1,cnt2,f[maxn],vis[maxn];struct xy{int x,y;}node[maxn];int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}...原创 2020-02-20 09:39:13 · 659 阅读 · 0 评论 -
L2-011 玩转二叉树 (25分)
#include<bits/stdc++.h>using namespace std;int n,cnt;vector<int>in,pre,level(1000000,-1);void levelorder(int root,int start,int end,int index){ if(start>end) return ; int i=star...原创 2020-02-19 17:35:13 · 1935 阅读 · 0 评论 -
L2-008 最长对称子串 (25分)【20行极短代码】
#include<bits/stdc++.h>using namespace std;int main(){ string s; getline(cin,s); string cnt="#"; int len=s.size(); for(int i=0;i<len;i++) cnt+=s[i],cnt+='#'; len=cnt.size(); int an...原创 2020-02-19 17:19:26 · 874 阅读 · 6 评论 -
L2-006 树的遍历 (25分)【极简代码】
#include<bits/stdc++.h>using namespace std;int n,cnt;vector<int>in,post,level(1000000,-1);void levelorder(int root,int start,int end,int index){ if(start>end) return ; int i=sta...原创 2020-02-19 15:49:54 · 509 阅读 · 0 评论 -
L2-005 集合相似度 (25分)(极短代码 STL)
STL大法好!!!大致思路如下:建立一个外核vector内核set的二维数组。然后每个set就代表着一个集合。接收数据后,比如查集合A和集合B,首先让nc=0,nt=B的大小。然后遍历A中数在B中找(用到find函数)如果能找到说明是共有的就nc++,没找到说明在并集中让nt++;代码如下:#include<bits/stdc++.h>using namespace std;...原创 2020-02-19 15:34:55 · 326 阅读 · 0 评论 -
L2-026 小字辈 (25分)(DFS思路+极短代码)
首先建立一个二维动态数组,存储每个编号的孩子。建立一个一维数组用来记录每个编号的是第几代根据这个二维数组也能直接找到根结点的编号,然后从根节点开始深搜就可以了。代码如下:#include<bits/stdc++.h>using namespace std;const int maxn=100010;int n,a[maxn],x,root,ans,flag;vector&...原创 2020-02-12 10:05:03 · 749 阅读 · 0 评论 -
L2-020 功夫传人 (25分)(双解法 完整思路+极短代码)
首先捋一下题,给了一个初始值,然后没传一代就减少一点,如果是得到者就让他获得的功力乘以倍数,最后求得到者功力总和。那么也就是说我们需要找两个东西:1.得到者 2.得到者是第几代。思路一:建立一个二维动态数组,然后在输入的时候横坐标代表这个人的编号,这一行就存储它的徒弟的编号。如果是得到者的话就只存储它的倍数,顺便建立一个标记数组将对应编号标记为1(原先为0).这样接收完数据后。之间开始DFS...原创 2020-02-11 18:18:59 · 4703 阅读 · 4 评论 -
7-98 汉密尔顿回路 (25分)
#include<bits/stdc++.h>using namespace std;int n,m,k,g[210][210];bool vis[210];int main(){ cin>>n>>m; for(int i=0;i<m;i++) { int a,b; cin>>a>>b; g[a][b]...原创 2020-02-11 17:20:03 · 1136 阅读 · 0 评论 -
7-105 串的模式匹配 (25分)(strstr的应用 )
看网上题解大部分都是用的KMP,个人比较懒,看到这个题感觉依稀记得有一个函数可以用来找子串。strstr(s,t)函数,在s串中找子串t,如果没找到返回false,如果找到就返回剩下部分。正好和该题题意完美契合,事实证明掌握一些函数关键时刻有奇效,代码如下:#include<bits/stdc++.h>using namespace std;char s[1000100],...原创 2020-02-11 15:06:05 · 503 阅读 · 0 评论 -
7-67 任务调度的合理性 (25分)(拓扑排序+极简代码)
#include<bits/stdc++.h>using namespace std;const int maxn=110;vector<int>g[maxn];int n,in[maxn],k,x,cnt;queue<int>q;void topSort(){ for(int i=1;i<=n;i++) if(!in[i]) q....原创 2020-02-09 17:59:15 · 605 阅读 · 0 评论 -
7-66 哥尼斯堡的“七桥问题” (25分)(极简代码)
写在前面:虽然这就是一个典型的DFS板子题,但是讲道理,这道题还是比较坑的。因为题目上没有说欧拉回路是不能有奇数顶点的(当然,这确实是欧拉回路的性质,但是这对没学好离散的人很不公平啊),如果不考虑这个情况样例二就会输出1.。代码如下:#include<bits/stdc++.h>using namespace std;int n,m,flag,e[1001][1001],vi...原创 2020-02-09 17:27:12 · 954 阅读 · 0 评论 -
7-65 笛卡尔树 (25分)(非常规做法+完整思路+极简代码)
写在前面:看到这个题,感觉并不难。算是模板题。不过翻看了一下网上的题解,基本上全是常规的建立一个二叉搜索树,建立一个小顶堆(也可以用优先队列)。然后分别遍历判断。当然,我比较懒,就没去建树建堆。思路:首先建立结构体数组来存储每个节点的k1,k2,左右孩子编号。然后在接受数据的时候,用一个前驱数组pre[]来存储每个结点的前驱结点,不仅可以用这个数组找到根还可以用它遍历判断,这样就可以不用建树...原创 2020-02-09 17:21:59 · 448 阅读 · 0 评论 -
7-64 修理牧场 (25分)(完整思路+极短代码stl)
写在前面:不得不说,这道题是真的真的真的很有趣,有的时候刷题刷着刷着突然能写一道有趣的题让自己眼前一亮,确实不错!思路:首先我们想,一整块木板,怎么切比较合适。如果一块30长的木头第一次切了29和1 花费30 第二次又切了28和1 花费29 或者第一次切了15和15 花费30 第二次又切了7 8花费15 是不是感觉要考虑到的因素太多了,如果写代码的话首先块数是未知的,然后每块都是多少...原创 2020-02-09 15:16:07 · 1258 阅读 · 0 评论 -
7-43 哈利·波特的考试 (25分)(完整思路+极短代码)
说来惭愧,刚开始没理解清楚题目意思,以为是连通图求最小生成树。。。。好,我们来分析一下这道题,每个动物都可以用咒语变成另一个动物,首先我们可以没两条动物直接的咒语当作是两地之间的距离保存起来。然后就是多源最短路(什么?你问为什么是多源,因为你不知道那个起点最短,求得就是最短的)。多源最短路用Floyd算法,求完之后,每行就是顶点i到各顶点j的最短距离,然后找出每行的最大值,再把所有行的最大值比...原创 2020-02-07 15:54:39 · 630 阅读 · 0 评论 -
7-41 列出连通集 (25分)(BFS+DFS)
简单说一下,这道题就是基础的BFS+DFS两次搜索。不过相较于搜索的模板题,这道题还是要求你掌握搜索的过程和原理,BFS还好说,如果不是一个联通集的话,那他肯定不是一所有点都连在一起的,就再进行BFS,DFS也一样。代码如下:#include<bits/stdc++.h>using namespace std;const int maxn=20;int n,m,mp[max...原创 2020-02-07 09:09:41 · 338 阅读 · 0 评论 -
7-39 堆中的路径 (25分)(模板+代码)
如果会建立堆的话,这应该就是个板子题了。不会建堆的话,推荐看一下我的这篇文章,模板积累一些对自己刷题用处是很大的【数据结构】堆的常规操作(建堆,删除,插入)代码如下:#include<bits/stdc++.h>using namespace std;int n,m,x,a[1010],pre[1010];void upAdjust(int i){ if(i==1)...原创 2020-02-06 20:45:16 · 176 阅读 · 0 评论 -
7-37 是否同一棵二叉搜索树 (25分)(极短代码)
这道题如果你会建立二叉搜索树的话应该就没什么问题了,比较的话就是从上到下依次比较看是否相等,比较简单。代码如下:#include<bits/stdc++.h>using namespace std;const int maxn=1024+7;int n,m,a[maxn],b[maxn];void build1(){ memset(a,-1,sizeof a); fo...原创 2020-02-06 20:20:02 · 198 阅读 · 0 评论 -
7-36 Tree Traversals Again (25分)(分析+完整思路+极短代码)
分析:刚开始做这道题的时候一头雾水,只看出来样例这个出栈序列是中序遍历,我寻思着根据中序遍历求后序遍历吗?后来看了一下网上别人的思路才明白少考虑了个东西。仔细观察可以发现push的数是图中这个树的前序遍历,而pop的数是图中这个树的中序遍历的序列。也就是说进栈序列为前序遍历序列,出栈序列是中序遍历序列。也就是所谓的根据前序遍历和中序遍历求后序遍历,不会的同学可以看一下我这篇博客前序,中序,后序三...原创 2020-02-06 19:33:17 · 467 阅读 · 2 评论 -
7-35 List Leaves (25分)(思路+极短代码)
分析:这是一道算是比较基础的数据结构体。建树+搜索。思路:建立一个结构体数组来存储每个结点的值还有它左右孩子的下标。然后输入的时候用一个pre数组来存储各节点之间的关系,用来找到这颗树的根节点。然后就是BFS搜索,如果搜到某个结点两个孩子值都为-1就输出就行,代码如下:#include<bits/stdc++.h>using namespace std;struct node...原创 2020-02-06 17:38:22 · 362 阅读 · 1 评论 -
7-34 树的同构 (25分)(思路+代码 递归实现)
思路:这道题让判断两个树是否同构,那么我们首先要建立出来这两颗树,然后用一个数组pre来存储各节点之间的关系,然后找出这两颗树的根节点。做到这里,基本就已经完成了,接下来就是判断。这里用到了递归判断,判断过程大致如下(具体可结合代码):1.先判断两颗树是否为空,如果都是空树,肯定一样,如果一个为空一个不为空就肯定不一样。2.判断根节点的值是否一样,如果根节点值就不一样那肯定不一样3.判断...原创 2020-02-06 17:33:48 · 406 阅读 · 0 评论 -
7-33 Pop Sequence (25分)(完整模拟思路+极短代码)
这道题就是判断合法出栈序列。大致思路如下:因为已知入栈顺序为1,2,3,4,,,n。所以首先建立一个栈用来模拟进栈,然后建立一个一维数组用来存储每次输入的出栈序列。然后进栈的时候如果栈顶与当前一维数组的数相等,就把栈顶删除,一维数组当前的下标+1,以此类推,如果不相等,就再入栈(此时如果入栈后栈的大小大于最大容量,则不合法)。最后根据栈是否为空.来判断是否合法。下面举个简单的例子可以帮助你理解...原创 2020-02-06 09:11:28 · 492 阅读 · 3 评论 -
7-32 Reversing Linked List (25分)(思路+最后一个测试点+极简代码)
思路:首先用结构体数组来接受输入的数据。然后从begin开始将这个链表从前到后还原,存到一个动态数组中。然后开始翻转,注意翻转的是**[i,i+k)** 左闭右开区间。而reverse函数正好是左开右闭区间。最后再遍历输出就可以。注意:可能给的结点有的不在链表上,这时就不用管不在链表上的点了,不用翻转也不用输出(这是最后一个测试点,这个测试点坑了我好久)。代码如下:#include<...原创 2020-02-05 21:08:02 · 1050 阅读 · 2 评论 -
7-30 深入虎穴 (25分)(反向递归求路径 极简代码+思路和分析)
分析:这道题其实就是一道典型的搜索题,bfs和dfs应该都可以做,好像当成加权并查集也可以做,只不过并查集的话会有点麻烦。很多人可能上来就会从入口开始暴力往下搜,搜到底然后找出最远的。这是常规解法。思路:首先定义两个数组,一个用来存储每个门到入口的距离,另一个用来存储这个门的上一个门是哪个门,这样就可以把所有门连起来(你可以在纸上画一下,会发现最后会构成一个跟树一样的东西)。然后我们很容易能够...原创 2020-02-05 19:20:18 · 1705 阅读 · 1 评论 -
7-31 Maximum Subsequence Sum (25分)(一次循环解决)
求最大子序列,暴力的话是两重循环,一重让每个数都当开头,一重来控制它的长度。下面这个代码只用了一重循环,但是用到了三个标记变量,first用来标记目前找到的最大子序列的开头,secon用来标记目前找到的最大子序列的结尾。至于t,t用来控制移动first,这句话你细品,代码如下:#include<bits/stdc++.h>using namespace std;int n,x,...原创 2020-02-05 19:00:30 · 211 阅读 · 0 评论 -
7-28 单身狗 (25分)【stl大法好】
#include<bits/stdc++.h>using namespace std;map<string,string>m;set<string>s,s2,s3;int n,flag;int main(){ cin>>n; for(int i=0;i<n;i++) { string a,b; cin>>...原创 2020-02-04 21:27:57 · 341 阅读 · 0 评论 -
L1-064 估值一亿的AI核心代码 (20分)(极短代码)
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; getchar(); while (n--) { string s; getline(cin, s); cout << s << endl; while (s[0] == ...原创 2020-02-02 10:38:39 · 3455 阅读 · 5 评论 -
7-100 统计单词数量 (10分)
#include<bits/stdc++.h>using namespace std;int f=1,cnt;char ch;int main(){ while((ch=getchar())&&ch!='\n') if(isalpha(ch)&&f) { f=0; cnt++; } else if(!isalph...原创 2020-02-01 21:22:29 · 1351 阅读 · 0 评论 -
L2-001 紧急救援 (25分)(dijkstra+打印路径 【详】)
说起来这道题确实有点复杂,刚学会dijkstra的我也不知道搞了多少天才彻底弄懂了这道题。下面直接上代码。还不会dijkstra的同学可以看一下我的这篇文章求最短路dijkstra算法模板(c++)#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f,maxn=510;int n,m,c1,c2,...原创 2020-01-30 15:56:03 · 1138 阅读 · 1 评论 -
L1-059 敲笨钟 (20分)(c++ 极简)
#include <iostream>#include <string>using namespace std;int main(){ int N; string s; cin>>N; getchar(); while(N--) { getline(cin,s); int ok = 1; for(int i = 0;i <...原创 2020-01-28 21:36:19 · 1438 阅读 · 1 评论 -
L1-058 6翻了 (15分)(c++ 17行代码极简)
#include<bits/stdc++.h>using namespace std;int main(){ string s; int i,j; getline(cin,s); for(int i=0;i<s.size();i++) { if(s[i]=='6') { for(j=1;i+j<s.size()&&s[i+j]...原创 2020-01-28 21:35:01 · 640 阅读 · 0 评论 -
L1-044 稳赢 (15分)(c++极简代码)
#include<bits/stdc++.h>using namespace std;int n,cnt;string s[]={"ChuiZi","Bu","JianDao"},t;map<string,int>m;int main(){ m["ChuiZi"]=0;m["Bu"]=1;m["JianDao"]=2; cin>>n; wh...原创 2020-01-28 20:46:07 · 468 阅读 · 0 评论 -
L1-033 出生年 (15分)【set解法 极短】
#include<bits/stdc++.h>using namespace std;string str;set<char>s;int n,y,cnt;int main(){ cin>>y>>n; while(s.size()!=n) { s.clear(); str=to_string(y+cnt++); whil...原创 2020-01-28 16:54:24 · 400 阅读 · 0 评论 -
L2-006 树的遍历 (25分)(思路+递归实现代码)
写在前面:做这道题的时候我还是刚入算法的渣渣,本来想着用数据结构上学的传统方法建树再按层遍历。后来因为学艺不精且自己太懒了。。。。(唉,一言难尽)。然后去看了柳神的代码还有网上各位大佬的题解,硬是研究了一下午,终于弄明白了这道题。思路:与后序中序转换为前序的代码相仿(无须构造二叉树再进行广度优先搜索~),只不过加一个变量index,表示当前的根结点在二叉树中所对应的下标(从0开始),所以进行一...原创 2020-01-21 19:42:59 · 375 阅读 · 0 评论 -
【PTA团队天梯赛】L2 7-98 海盗分赃 (25分)
这个题我刚开始做的时候感觉虽然题目描述不多,但是我却一直没有get到题目的意思。后来看了一下网上的题解,感觉这个题真的是太巧妙了!所以记录一下。思路:首先我们要理解这三个原则。每个海盗都想尽可能获得最多的钻石,但是前提是要活着,比如说你拿走了全部钻石,那别人肯定不同意就会把你杀死。所以你分配钻石的情况下还要争取得到一半的人的投票。其次,如果有两个海盗的时候你能拿到两个钻石,而现在多了一个海...原创 2020-01-19 10:25:02 · 986 阅读 · 1 评论