随笔分类 - PTA
摘要:一、题目描述 二、解题思路 这个题用常规的dp是行不通的,应为数据量太大了。那么应该怎么优化呢。 答案是采用矩阵优化 我们构造一个这样的矩阵,然后乘以以F1、F2构造得2*1的矩阵 为了发现规律,我们再乘一次 我们发现每一次左乘一个我们构造得这样的矩阵,我们都会得到下一个数列。分析下标关系可知,我们
阅读全文
摘要:一、题目描述 二、解题思路 这题其实就是枚举每个位置,然后根据这个位置判断需要剔除几个人,反向思考,我们需要剔除几个人。 pos之前的部分做一个最长递增子序列的dp,用前面的总人数减去最长递增就是前面部分需要剔除几个人 pos之后的部分做一个最长递减子序列的dp,用前面的总人数减去最长递减就是后面部
阅读全文
摘要:一、题目描述 二、解题思路 这道题是一个贪心的问题。不能想当然的直接按照面积直接装,因为箱子是一个整个的,不可以分开。 首先是6*6的箱子,你可以直接装 然后是5*5的箱子,你在装完一个5*5之后,最多只能再装11个1*1,是1*1尽量往这里面装。一直到5*5的箱子装完 然后是4*4的箱子,装完一个
阅读全文
摘要:一、题目描述 二、解题思路 这题是一个概率DP题,我们考虑三种情况 我们用dp[i][j]代表i张印章能凑出j种,设p = 1 / n 显然第一种情况 当i<j时,dp[i][j]=0,因为不可能凑出j种 第二种情况 当j = 1时,此时选出的i张里面都是某一种,概率是(p^i),又因为可能都是n中
阅读全文
摘要:一、题目描述 二、解题思路 每次插入一个元素我就进行一次堆的调整,不要存着最后再进行堆调整。用一个map记录每个元素在队中的位置,剩下的就是读入的问题了。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int inf
阅读全文
摘要:一、题目描述 二、解题思路 我们枚举n的因子,然后枚举这个因子的最大长度,然后做个标记。最后在输出答案的时候反推就可以了。 三、代码实现 1 #include "bits/stdc++.h" 2 #define PII pair<int,int> 3 #define rep(i,z,n) for(i
阅读全文
摘要:一、题目描述 二、解题思路 这里我们直接枚举1的个数,然后看看是否能够整除,就是个大数除法的内容。这里注意中间可能有为0的情况,列如530 / 5 = 106中间这个0要注意。 这里大数除法是这样进行的。 比如说123 / 5 第一次1 / 5为0,那么第一个就为0,余数为1 第二次利用上次的余数*
阅读全文
摘要:一、题目描述 二、解题思路 用map模拟这个链表,然后用vis数组去重,用两个vector存答案,一个存去重后的链表,另一个存去重的节点。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 string
阅读全文
摘要:一、题目描述 二、解题思路 这是个简答的贪心题,就直接按照平均价位从大到小排序,然后一直取就行了,直到所有的吨用完了。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 double num; 5 do
阅读全文
摘要:一、题目描述 二、解题思路 首先根据他的原规则建树,然后根据原规则相反建树。最后遍历这两棵树中是否有一颗的前序和输入序列相同,相同就输出这棵树的后序。题目很简单,就是做起来挺麻烦的。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3
阅读全文
摘要:一、题目描述 二、解题思路 首先这个题意讲的我迷糊,最后才知道这个Nc就是交集,Nt就是并集。然后我老老实实用set,map做,T了一个点。最后上网一搜,发现别人用了神奇的stl大法求交集并集。 三、代码实现 1 #include "bits/stdc++.h" 2 #define PII pair
阅读全文
摘要:一、题目描述 二、解题思路 这个题就是个暴力枚举题,分两种情况。 (1)——奇数情况:我们可以这样搜,从某个位置开始向两边枚举,直到到边界 (2)——偶数情况:对于每一个位置,我们从当前位置向左,从当前位置的下一个位置向右。 三、代码实现 1 #include "stdio.h" 2 #includ
阅读全文
摘要:一、题目描述 二、解题思路 这个题排个序就可以了,在输入的时候用个vis数组去重就行了。 三、代码实现 1 #include <bits/stdc++.h> 2 using namespace std; 3 double b[100010]; 4 int red[100010]; 5 struct
阅读全文
摘要:一、题目描述 二、解题思路 刚开始想到的是直接暴力模拟算出答案,然后超时了,后来发现其实对于每个轨道,如果需要新增轨道,那么最后那个列车的编号一定是递增的,那么此时我们可以采用二分优化这个搜索过程。优化后成功AC。 比如样例 你会发现每次插入都是递增的,故可以采用二分优化算法。 三、代码实现 1 #
阅读全文
摘要:一、题目描述 二、解题思路 对于每个成绩排个序,去掉最高和最低就行了,然后把平均分放入vector就行了。再把vector排个序输出 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int n,m,k; 4 double ave[
阅读全文
摘要:一、题目描述 二、解题思路 要想两边的差距尽可能大,而且要人数尽可能平均,那么这就是一个典型的贪心的问题了。我们只需要把数组排个序,然后从前到一半,从一半到最后,统计一下和。然后输出即可。但是这个题有个问题就是当人数为奇数时,你要考虑把中间那个人加到左边还是右边答案更优。 三、代码实现 1 #inc
阅读全文
摘要:一、题目描述 二、解题思路 定义一个map,set,vector,vector负责存答案,map负责统计人和分数的映射,最后遍历答案串的时候,如果他没有在set里面出现过,并且他的map映射的分数大于平均分,那么就是答案,直接输出就可以。 三、代码实现 1 #include "bits/stdc++
阅读全文
摘要:一、题目描述 二、解题思路 利用map存储这个链表的顺序。前面那个string代表当前节点,映射的是一个结构体,里面存了下一个节点的信息,遍历一遍全部存入一个vector里面,然后从两边输出就行了。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespac
阅读全文
摘要:一、题目描述 二、解题思路 一个普通的bfs模板题,但是要用链式前向星优化内存,不然机会内存超限。在bfs过程中不断更新答案,也就是最小点。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int heads[10010]; 4
阅读全文
摘要:一、题目描述 二、解题思路 用数组模拟建完全二叉树,可知节点个数,若为完全二叉树,则前n个节点没有为0的,若前面有为0的,那么我们就输出No。至于输出节点,我们可以一直遍历到找到n个数再退出。刚好从前到后满足层次遍历。 三、代码实现 1 #include "bits/stdc++.h" 2 usin
阅读全文