- 博客(30)
- 收藏
- 关注
原创 2021天梯赛L2-039 清点代码库 (25 分)
链接: link.#include <bits/stdc++.h>using namespace std;const int N = 1e4+10;struct cmp//自定义set排序{ bool operator() (const pair<int,vector<int> >&a, const pair<int,vector<int> >&b) const { if(a.first
2021-04-26 20:41:47 1462 5
原创 2021天梯赛L2-038 病毒溯源 (25 分)
链接: link.#include <bits/stdc++.h>using namespace std;const int N = 1e4+10;vector<vector<int> > g;//存下病毒关系vector<int> ans,tmp;//存变异链bool vis[N];//标记数组,用于查找根病毒int n,k,cnt;void DFS(int u,int sum){ if(sum>cnt)//如果sum大
2021-04-26 19:52:30 1066
原创 AcWing 1381 阶乘
链接: link.首先n的范围是(1,1000),所以暴力是一定不行的。我们可以进行以下操作避免超范围。1.不断去除末尾的0,也就是不断除10,直到最后一位非零。(非零位后面的0对之后的阶乘没有影响)。2.每次都对1e9取模,控制数据范围。#include <bits/stdc++.h>using namespace std;const int mod = 1e9;int main(){ int n; cin>>n; long long
2021-04-05 20:37:17 103
原创 PTA补题 7-14 直捣黄龙 (30 分)
链接: link.这道题和一道25分的题差不多,都是求有条件的最短路,只不过这个题是输入字符串代表城市而不是单纯的数字编号,而且还多了一个条件。由于数据量不大,我们直接用结构体存储城市信息即可。另一题的博客链接: link.#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int N = 220;int Map[N][N];int len[N],cnt[N],sum[N],path[
2021-04-05 17:09:17 627
原创 LeetCode 74. 搜索二维矩阵
链接: link.本题我们可以用两种方法做。双指针法因为矩阵是从左到右递增,从上倒下递增,所以一开始我们选中右上角的位置,根据当前位置的值和key值的大小挪动我们的指针,直到找到key值或者找完所有满足条件的位置。class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty()||matrix[0].em
2021-03-30 18:44:01 79
原创 堆
什么是堆堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足一下性质:1.堆是一棵完全二叉树(除最后一层外,每层节点非空。最后一层从左到右排列)。2.对于小顶堆,每个节点小于或等于左右节点(大顶堆反之)。堆的存储方式我们通常用一维数组来进行存储。假设我们用h[N],数组表示。那么h[1]就是我们堆的根节点,也是堆中的最小值。而对于x节点,他的左儿子是2x节点,右儿子是2x+1节点。堆的基本操作down(x) 向下调整因为要满足性质当我们
2021-03-26 21:05:27 109
原创 PTA二叉树习题(二叉树翻转)
链接: link.这道题主要就是考察二叉树的重建和翻转,也就是左右子树互换。我们直接看代码。#include <bits/stdc++.h>using namespace std;const int N = 35;int str1[N],str2[N];struct node{ int data; struct node *l,*r;};struct node *create(int str1[],int str2[],int n){//根据先序遍历和
2021-03-20 20:25:33 210
原创 混合背包问题
链接: link.我们使用多重背包的二进制优化,将其分成多个01背包。我们再申请一个bool类型的s数组用来判断我们之后的操作,true为01背包,false为完全背包#include <bits/stdc++.h>using namespace std;const int N = 10010;int n,m;int v[N],w[N];bool s[N];int dp[N];int main(){ cin>>n>>m; int
2021-03-19 20:07:51 112
原创 求一个数的二进制有多少个一
x=x&(x-1) 可以将x最后一位的1消除。例如:11111&11110结果为11110,11110&11101结果为11100,11100&11011结果为11000…这样就可以知道一个数二进制有多少个1。int solve(int x){ int sum = 0; while(x) { x = x&(x-1); sum++; } return sum;//返回的sum就是1的个数}例题链接:
2021-03-17 17:23:37 231
原创 二分图模版
二分图的基本概念二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。匹配:1.匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个
2021-02-23 09:09:36 714 3
原创 AcWing 143 最大异或对(Trie)
链接: link.用Trie(字典树),建树时,根据每个数字的对应的二进制串构造一个二叉树,每个结点两个分支,分支指向的两个son结点分别表示当前位的数值为0或1,记录每次输入的数字转化成的二进制串,当前位为1,就走到数值为1的结点,否则走到0结点,这样每个数字对应的Trie中的路径就是唯一的。因为要求异或值最大,所以用贪心的思想,在第一个数字固定的情况下,尽可能地让第二个数的每一位都与第一个数的对应位相反,这样最终确定的第二个数与第一个数的异或值就最大,所以在查询时,根据固定的第一个二进制串,每次尽可能
2021-02-12 19:10:02 118 1
原创 AcWing 1613 数独简单版
链接: link.数据比较小,我们直接采取暴力的搜索方式。从左上角(0,0)开始:1.如果当前格子是 ‘ . ’,我们就按照行,列,3*3九宫格判断我们可以填什么数字,然后搜索所有能填的数字。2.如果当前格子是数字,我们直接跳过。当进行完每一层搜索:1.如果当前行不是最后一行,我们就跳到下一行。2.如果当前行是最后一行,我们直接返回。代码实现#include <bits/stdc++.h>using namespace std;const int N = 10;char g[
2021-02-12 18:42:25 133
原创 AcWing479 加分二叉树(区间dp)
链接: link.这道题我们根据题意,要我们求得二叉树最大的加分,并输出字典序最小的方案。貌似是对二叉树的考察,但并不是,我们需要用区间dp解决这道题。首先我们看一下什么是区间dp区间dp区间dp 是一种建立在线性结构上的对区间的动态规划,求解一段区间上的最优解。区间dp 我们一般是将大区间转化成小区间,然后对每个小区间求最优解,进而得到大区间的最优解。区间dp问题和背包问题一样是有模板的,模板有三要素:区间长度,区间起点和终点,分割下面我们看一下模板for(int len=1;len&
2021-02-01 15:20:05 156
原创 AcWing 1402 星空之夜(Flood Fill 算法)
链接: link.首先根据题意,我们应该先找出所有连通块,这里我们用到的是Flood Fill 算法。然后我们要判断两连通块形状是否相同(通过旋转或对称可以使连通块变到重合)。这里我们采用哈希存储下不同形状的连通块。我们要保证形状形同的连通块映射到同一个数,且尽量避免冲突。这里我们采用两两之间的欧几里得距离作为哈希函数。Flood Fill 模板BFS模板void bfs(int a,int b){ queue<PAIR> q; st[a][b] = true;
2021-01-30 16:40:21 138
原创 7-11 悄悄关注
新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。输入格式:输入首先在第一行给出某用户的关注列表,格式如下:人数N 用户1 用户2 …… 用户N其中N是不超过5000的正整数,每个用户i(i=1, …, N)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。之后给出该用户点赞的信息:首先给出
2020-10-30 20:41:12 169
原创 7-4 城市间紧急救援(最短路Dijkstra)
题目链接: link.题目要求最短路径个数,最多的救援队数目和最短路径经过的点。求最短路径个数和救援队数目直接套用Dijkstra的模板即可,我们的重点在于如何记录下经过的点。我们用一个path数组记录点,当我们找到路径最短的点pos时,我们用path[j] = pos 记录。最后我们再从终点出发反向找出经过的点。#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h
2020-09-18 19:54:07 763
原创 Weird Sanchola
Weird SancholaGym - 102302J 我们先找到数组中的中位数,在从中位数出发寻找距离中位数最近的素数。设x=n/2,这里要注意的是当n为奇数时,数组的中位数是a[x+n%2]而n为偶数时数组的中位数是a[x],a[x+1]。存在两个值,所以我们要考虑a[x],a[x+1]之间存在的素数。解决这一特殊情况,剩下的就是从中位数开始向两边遍历查找素数,找到后再进行计算,得到最小值。#include <iostream>#include <cstdio>
2020-09-14 15:20:39 218
原创 KMP算法模板
例题SDUT OJ 数据结构实验之串一:KMP应用#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h>#include <algorithm>using namespace std;const int N = 11234567;int n,m;int Next[N];int a[N],b[N];void get_next(in
2020-09-09 21:29:17 117
原创 20208-17 个人赛补题
链接: link.我们采取暴力遍历即可#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>using namespace std; int main(){ char s[510][510]; int n,m; cin >> n >> m; for(int i=1; i<=n; i++
2020-08-18 15:34:55 124
原创 2020-8-13 组队赛补题
链接: link.#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h>using namespace std;char Map[15][15];int vis[15][15];int cnt;int d[][2] = {0,1,0,-1,1,0,-1,0};void DFS(int x,int y){ for(int i=0; i<
2020-08-14 10:43:34 136
原创 2020-8-11 组队赛补题
链接: link.我们把信件的投递看作在坐标轴上移动,起始坐标为x=1,根据单词的首字母我们建立一个数组存放投递位置的坐标,随着不断移动我们不断更新x的值#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define INF 0x3f3f3f3fint judge(char s[]){//我们根据首字母来进行分类储存 if(s[0]=='
2020-08-12 09:04:39 141
原创 2020-8-10 个人赛补题
链接: link.判断是否能改造成回文串,直接暴力解决,我们设一个num[]数组存放各字母出现的次数,如果个数为奇数的字母的数量大于一则能不能构成回文串,反之可以。我们还需要按最小字典序输出,采取正序和倒序各遍历一次,每次输出num[i]/2个,如果存在个数为奇数的字母,我们在第一次正序遍历后再输出一个该字母。#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h&g
2020-08-11 09:10:34 120
原创 2020-8-8 模拟赛补题
PTA 7-10 排座位这道题中,因为朋友关系是可以传递的,所以我们用并查集来储存朋友关系。敌对关系不可传递,所以我们用一个邻接表储存敌对关系。再根据题目要求进行输出#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h>using namespace std;int pre[1010];int Map[1010][1010];//并查集模板in
2020-08-10 10:58:50 128
原创 2020-8-7 个人赛补题
链接: link.这个题一开始想用KMP解决,发现在字符串中间可能会有“fashjhfSussu”这样的形式,所以还是采取暴力解决#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h>using namespace std;const int N = 1001000;char str[N];int main(){ int flag =
2020-08-08 10:51:22 106
原创 字典树
基础知识我感觉自己总结的不太好,推荐大佬的博客和视频,配合食用效果更好。博客链接: link.视频链接: link.模板#include <iostream>#include <string.h>#include <cstdio>#include <cstdlib>using namespace std;int Tree[100010][26];//tree[pos][k]:编号为pos的点走到编号为tree[pos][k]的点所需要
2020-08-01 14:21:59 109
原创 2020-7-30 组队赛总结
心得体会今天参加了暑假集训的第二次组队赛,我之前基本上没有接触过团队打比赛,算上今天是第三次(大一上学期有个擂台赛),所以显得有点生疏,当然收获也是满满的。团队赛不仅仅考验一个团队,更是对每一个队员的考验。我们都知道木桶效应,最短板决定了水的上限,我认为我的能力还远远不够,因为前几次个人赛我的成绩不是很理想,所以我要更加努力,追上成绩靠前的同学。我相信在每个队员的努力下,团队的成绩会越来越好,也只有每个队员都努力才能达到1+1+1>3的效果。 加油,未来在等着我们!补题今天的题目我感觉整体比上次
2020-07-30 20:33:44 199
原创 多重背包问题
问题有n种物品和一个容量为m的背包。第i种物品体积为w[i],价值为v[i],数量为num[i],(注意数量不再是一个或无限个)。在总体积不超过m的情况下,能装入背包的最大价值是多少?分析一分析一与完全背包的另一种分析类似,我们还是考虑第i种物品放几件:0…num[i]件,所以我们得出状态方程://k为放入第i种物品的个数,k<=min(num[i],j/w[i]) dp[i][j] = max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);同同样的我们也可以对其
2020-07-30 09:54:18 116
原创 完全背包问题
完全背包的概念完全背包问题与01背包的概念大体相同,二者最大的不同是:01背包问题中每件物品的个数只有一个,而在完全背包中物品的个数是无限个。也就是说我们在选择物品时,同一种物品我们可以多次选择以得到最优解。问题分析首先我们还是定义一个dp[i][j]数组用来记录状态,i表示第几件物品,j表示背包的容量。同样我们也分为两种情况:不放入第i件物品,也就是dp[i-1][j]这与01背包相同。我们选择放入第i件物品,这种情况下两种背包问题就不同之处了,01背包的状态方程是:dp[i][j] =
2020-07-28 21:04:17 169
原创 01背包问题
一丶01背包的概念有n件物品和一个容量为m的背包,每件物品只有一件(重点)。第i件物品的质量为w[i],其价值为v[i]。我们需要求得在不超过最大容量的情况下我们放入什么物品可以获得最大价值总和。二丶状态方程我们可以根据物品和容量确定一个状态,第i件物品放在背包中,总容量不超过j的情况下,我们可以获得的最大价值为dp[i][j]。如果j小于w[i]:dp[i][j] = dp[i-1][j]如果j大于或等于w[i],小于或等于m:dp[i][j] = max(dp[i-1][j],dp[i-
2020-07-27 15:00:55 131
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人