- 博客(91)
- 收藏
- 关注
原创 蓝桥杯-第几个幸运数
tips:我们需要注意的是我们用ll定义的数据,int是不能用ll的数据的,定义必须保持一致#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<map>#define ll long longusing namespace std;map<ll,int>mp;ll ans
2021-05-31 20:51:13
226
原创 蓝桥杯-凑平方数
tips:有些题得出答案的时间会比较长,这时候我们需要等一会,如果不放心怕是出现了什么问题可以设置一个输出,就是当有满足题意的数据出现后就输出一次,这样我们就会看到明显的结果#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>using namespace std;int s[10] = {0,1,2,3,4,5,6,7,
2021-05-31 17:56:57
133
原创 蓝桥杯-承压计算
tips:我们需要注意的是需要输出一串数字的时候我们最好使用printf输出,因为若是用cout输出则会到时输出不完整#include<iostream>#include<cstdio>#include<cstring>#include<algorithm> using namespace std;double num[100][100];double minn = 0x3f3f3f3f,maxx = -2e9;int main(){
2021-05-31 15:03:40
163
原创 蓝桥杯-第39级台阶
tips:有一个错点是没有考虑走楼梯超出限制(39级)的情况,若是不考虑的话我们将会搜不到答案,因此我们应该在超出39级台阶的时候return#include<iostream>#include<cstdio>#include<cstring>#include<algorithm> using namespace std; int cnt = 0;void dfs(int step,int all){ if(step>39) re
2021-05-31 14:47:24
355
原创 蓝桥杯-高斯日记
tips:到底4月30日是第一天,或者4月31日才是第一天?这些需要我们具体调整,题目中给了一个5000多天的测试项,我们可以得到4月30日其实是第一天#include<iostream>#include<cstdio>#include<cstring>#include<algorithm> using namespace std;int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};i
2021-05-31 14:20:57
105
原创 蓝桥杯-数的分解
tips:我们用三重循环肯定会炸,但是我们可以把k表示为2019-i-j,这样我们就会少一重循环#include<iostream>#include<cstdio>#include<cstring>#include<algorithm> //最后一个数就是2019减去前两个数 using namespace std; //把2019分解成各不相同的三个数的和 int cnt = 0;bool check(int num){ while(nu
2021-05-31 14:01:50
237
原创 [NOI2011] 道路修建
洛谷链接:https://www.luogu.com.cn/problem/P2052我们先思考一下怎么表达题意题目要求的是求出当前点和其他点连线之间的特殊权值之和这种特殊权值就是左边点的集合和右边点的集合差的绝对值*边的权值(abs(size[u]-size[v])*w[i])这种很容易让人想到统计每个节点下面的子树也确实需要统计每个节点下面的子树但是我们知道刚开始我们是任意选一个点去遍历的,也就是说指不定哪个点作为根节点,那么我们就需要想如何通过一次两次的dfs来得到我们想.
2021-05-16 16:06:14
353
原创 打开所有灯
洛谷链接:https://www.luogu.com.cn/problem/P1649错点:退出时机的选择若是从1点开始选,那么选到第9个点选完之后下一次进入的时候就是第10步,那么应该是在11步的时候return因为在走完第9步之后是有可能得到答案的,若是我们在第10步进行判断的话所以一定要注意!!!//需要搜索的次数会比较少 #include<iostream>#include<cstdio>#include<cstring>#inclu
2021-05-16 10:07:07
248
原创 马的遍历
洛谷链接:https://www.luogu.com.cn/problem/P1443#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;typedef pair<int,int>PII;int st[1010][1010];int dist[1010][10
2021-05-15 22:40:34
116
原创 单词接龙
单词接龙单词接龙是一个与我们经常玩的成语接龙相类似的游戏。现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”,每个单词最多被使用两次。在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish。我们可以任意选择重合部分的长度,但其长度必须大于等于1,且严格小于两个串的长度,例如 at 和 atide 间不能相连。输入格式输入的第一行为一个单独的整数n表示单词数,以下n行每行有一个单词...
2021-05-09 18:04:17
3407
1
原创 积蓄程度<原创解法>
有一个树形的水系,由N−1条河道和N个交叉点组成。我们可以把交叉点看作树中的节点,编号为1∼N,河道则看作树中的无向边。每条河道都有一个容量,连接x与y的河道的容量记为c(x,y)。河道中单位时间流过的水量不能超过河道的容量。有一个节点是整个水系的发源地,可以源源不断地流出水,我们称之为源点。除了源点之外,树中所有度数为1的节点都是入海口,可以吸收无限多的水,我们称之为汇点。也就是说,水系中的水从源点出发,沿着每条河道,最终流向各个汇点。在整个水系稳定时,...
2021-05-09 12:35:17
173
1
原创 树的中心
树的中心怎么去做?题目大意是找到一个点,使得这个点到周边点的最远距离最短我们首先想到的思路就是以每个节点为根,然后求这个点到其他点的最长路径这也就启示我们,在无向图中虽然是随便选择一个点都可但是求的最长路也是从这个点出发的最长路但是我们通过一次dfs就可以更新每个点到其下面的最长路,这是肯定的所以我们考虑怎么用一次dfs来得到所有点的最长路的信息也就是有效利用这次dfs得到的每个点到其下面节点的最长路这个信息是得到了,我们还缺什么?呼之欲出,我们缺的是除了根节点外的其他点到其上方的点的距离
2021-05-09 10:46:24
131
原创 树的直径
树的最长路径这题怎么分析?我们只要维护每个点的最长路径和次长路径然后求出最长路径和次长路径加起来的最大值要从一颗树中找出路径最长的一条路径我们先找到任意一个点然后找到某点到这个点的距离最远怎么收集长度?这是个问题但是这个就不是点的个数了而是计算的距离,那么我们每次在搜索之前都维护一个d1变量和d2变量d1变量存储最长路径,d2变量存储次长路径然后搜索的时候把每个父节点到子节点的距离加起来然后求一遍最大值就行但是有几个问题需要注意:d1和d2两个变量是放在for循环外面的,为什么?
2021-05-08 22:24:32
92
原创 树的重心
我们怎么考虑这个树的重心这题目?以每个节点为考虑对象,我们需要算出什么?首先就是每个节点的子树的最大值,这还就是我们还没有考虑上面的子树的情况题目要求的是去掉这个重心之后剩余连通块中点的最大值那么这个点上方的点是什么情况?这个点上面的点就是总的点数减去包括这个点的所有子树的点剩余的点啊所以我们要维护什么值?其一是所有子树中的最大值,还有总的结点数怎么更新?搜到子节点之后向上返回呗但是注意这要是无向边不然就没法搜到上面点的情况我们先记录每个点的sum值首先是1然后开始深搜搜到底之后
2021-05-08 20:21:50
89
原创 有依赖的背包问题
题目大致含义就是如果要选子节点的话就要选父节点那么我们很容易想到了,需要用子节点的值更新父节点的值,所以我们考虑用dfs直接深搜到子节点,然后层层递归更新父亲节点但是如何更新呢?这就需要决策了,这需要什么决策?决策给子节点多少容量这就有点类似于分组背包分组背包的决策是枚举我们要选择哪个物品那么我们可以这样理解,在子树更新完毕之后每一个容量值都对应子树的一个权值那么我们只需要枚举给予子树多少容量就可需要注意的是子树的的容量和根节点的容量的总和是m所以子树的背包容量是不能超过
2021-05-08 19:24:30
211
原创 没有上司的舞会
经典的树形dp问题#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 10010;int w[N],e[N],ne[N],h[N],fa[N],idx;int n,f[N][10];void add(int a,int b){ e[idx] = b,ne[idx] = h[a],h
2021-05-08 18:13:02
95
原创 八皇后 Checker Challenge
洛谷链接:https://www.luogu.com.cn/problem/P1219需要注意的是两条对角线和纵列是分别用三个数组模拟的然后每次递归的时候直接按照行递归就行了,用for循环枚举列,选中了就去下一行#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int list[100],dia1[100],
2021-05-06 23:04:48
264
原创 奇怪的电梯
洛谷链接:https://www.luogu.com.cn/problem/P1135显然dfs能求出最短距离,但是若是起点和终点相同并且从起点还能走到终点的话,那么步数就不是0了#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;int n,start,finsh;i
2021-05-06 21:59:00
132
原创 Maze
洛谷链接:https://www.luogu.com.cn/problem/CF377A注意点:这题是不需要回溯的,直接搜到底,但是别忘了标记,同时要注意的是在底部加上改变地图的语句#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m,k;int flag;char map[1010][1010]
2021-05-06 21:25:10
100
原创 血色先锋队
洛谷链接:https://www.luogu.com.cn/problem/P1332多次入队,但是入队的时候建议在bfs中入队#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;typedef pair<int,int>PII;int n,m,a,b;i
2021-05-06 20:54:23
159
原创 取数游戏
luogu链接:https://www.luogu.com.cn/problem/P1123只要注意点不是只被标记一次就好了,同一个点有可能被标记多次,但是只有标记全都被清除的时候这个点才能被选中~#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int w,n,m;int maxx = 0;int map[
2021-05-06 17:47:06
278
原创 递归练习
练习1:递归倒置字符数组(题目链接可提交:https://www.dotcpp.com/oj/problem1575.html)完成一个递归程序,倒置字符数组。并打印实现过程递归逻辑为:当字符长度等于1时,直接返回否则,调换首尾两个字符,在递归地倒置字符数组的剩下部分输入字符数组长度及该数组输出在求解过程中,打印字符数组的变化情况。最后空一行,在程序结尾处打印倒置后该数组的各个元素。样例输入5 abcde样例输出ebcdaedcbaedcba先...
2021-05-06 16:13:04
297
原创 最长公共子串
给定n个字符串,试求出这些字符串的最长公共子串。跟上一题:最长公共子序列有一点不同,就是子串必须是连续的那么状态转移就有区别:之前的最长公共子序列是可以由前面的任意点继承的,但是最长公共字串只能由上一种状态继承而来比方说f[i][j]表示的是a串前i个字符和b串前j个字符的最长公共字串,那么就只有一种转移方式:若a[i]==b[j],f[i][j] = f[i-1][j-1]+1,反之f[i][j] = 0;#include<iostream>#include<cs..
2021-05-03 14:14:27
570
原创 最长上升子序列模板
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−10^9≤数列中的数≤10^9输入样例:73 1 2 1 8 5 6输出样例:4借此经典问题我们分析一下dp问题的特性很多人(包括我)第一眼看见这题的时候人都是懵的,难道我们在遍历数组中每个数的时候都要维护一下当前值的最大值吗?这就涉及到了dp...
2021-05-03 11:37:39
198
原创 编辑距离
给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:删除–将字符串A中的某个字符删除。 插入–在字符串A的某个位置插入某个字符。 替换–将字符串A中的某个字符替换为另一个字符。现在请你求出,将A变为B至少需要进行多少次操作。输入格式第一行包含整数n,表示字符串A的长度。第二行包含一个长度为n的字符串A。第三行包含整数m,表示字符串B的长度。第四行包含一个长度为m的字符串B。字符串中均只包含大写字母。...
2021-05-03 11:10:39
111
原创 分组背包模板
有N组物品和一个容量是V的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是vij,价值是wij,其中i是组号,j是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数N,V,用空格隔开,分别表示物品组数和背包容量。接下来有N组数据:每组数据第一行有一个整数Si,表示第i个物品组的物品数量; 每组数据接下来有Si行,每行有两个整数vij,wij,用空格隔开,...
2021-05-03 09:33:53
413
原创 混合背包模板
有N种物品和一个容量是V的背包。物品一共有三类:第一类物品只能用1次(01背包); 第二类物品可以用无限次(完全背包); 第三类物品最多只能用si次(多重背包);每种体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有N行,每行三个整数vi,wi,si,用空格隔开,分别表示第i种物品的体积、价值和数量。si=−...
2021-05-02 23:36:56
261
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人