- 博客(331)
- 收藏
- 关注
原创 codeforces 1526 C
题面题意给你一个长度为n的序列a,你的初始生命值为0,你可以选择加上ai,但前提是保证在任何时刻生命值不小于0. 求最多能加多少个值。C1版本的的n为2000,C2版本的n为20000C1题解C1的n只有2000,可以直接用dp来做,f[i] [j] 表示在前 i 瓶中选择了 j 瓶的最大价值,就可以由 max ( f[i-1] [j] , f[i-1] [j] +a[i] ) 得到C1代码#include<bits/stdc++.h> using namespace st
2021-06-03 21:09:49
467
原创 codeforces 1526 B.I Hate 1111
题面题意给你一个数,判断它能否由11,111,1111,11111 …组成题解(打表)我们通过dfs打表发现,大于10000的数都是可以由题中所给条件组成的,所以我们只需要存放10000的数进行判断即可。代码#include<bits/stdc++.h> using namespace std;typedef long long ll;const int N=1e5+10;const int maxn=10000; int t,n;int arr[]={11
2021-06-03 20:50:30
520
原创 codeforces 1529 D.Kavi on Pairing Duty
题面题意给你一个n,坐标上有2n个点,间距为1,让你求出满足题意得方案数。每两个点连接成一条线段,要求线段两两之间要么长度相等,要么一个线段被另一个线段包含题解(找规律)设ai表示,n=i 时有多少方案数当n=1时,有1种情况,就是直接两个点连起来当n=2时,有3种情况先考虑存在包含,将最外的两个点连起来,这种情况下就递归回了a1,然后再考虑不存在包含,每遇到一个点连一条线,发现可以 ; 每遇到两个点连一条线,发现可以,方案数+2;当n=3时,6种情况
2021-06-02 21:50:00
508
原创 codeforces 1529 C.Parsa‘s Humongous Tree
题面题意给出一颗n个节点的树,每个节点的值有一个区间范围,问如何选取节点的值才能使这颗树变成完美的树,完美的树满足每条边所连接的两个节点的差值的绝对值之和最大题解(树形DP)我们知道,要想使两个节点的差值绝对值最大,那么这两个节点一定是去边界值,那么就变成了每个节点选左边界还是有边界f [u] [0] : 表示 u 节点取左边界的值f [u] [1] : 表示 u 节点取有边界的值建树后,直接从根节点开始dfs即可代码#include<bits/stdc++.h
2021-06-02 20:19:57
222
原创 codeforces 1529 B.Sifid and Strange Subsequences
题面题意给定一个序列,找一个最长的子序列,满足对于子序列的任意两个数ai,aj,(1<=i<j<=k),使得 | ai - aj | >= MAX (子序列中最大的数)题解对于子序列,如果都是负数或者0一定成立,因为绝对值不可能小于0,所以要想最长,就要包含所有的负数和0,对于正数,子序列中最多存在一个,因为如果大于一个,两个整数的绝对值肯定小于本身。所以只需要看原来序列中最小的正数,是否满足条件即可,两个负数的差值越小,那么差值绝对值就越小,所以给原序列
2021-06-02 16:01:32
212
原创 牛客小白月赛34 C dd爱科学2.0
题面题解f [i] [j] : 已经处理到了前 i 个字母,第 i 个字母是 j 的最小花费因为这个序列是非递减的,所以前一个不能大于后一个,直接枚举第 i -1 个字母是什么,来转移方程,最小花费就是 s[i] 变到 字母 j+‘A’ 的偏移量代码#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;char s[N];int n;int f[N][26];int main()
2021-05-29 09:54:42
328
2
原创 牛客小白月赛34 A dd爱科学1.0
题面题解f [i] [j] : 已经处理到了前 i 个字母,第 i 个字母是 j 的最小花费因为这个序列是非递减的,所以前一个不能大于后一个,直接枚举第 i -1 个字母是什么,来转移方程代码#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;char s[N];int n;int f[N][26];int main() { cin >> n >>
2021-05-29 09:32:41
242
1
原创 2017 ICPC西安 H Arrangement for Contests
题面题解线段树板子吧,维护一个区间最小值,懒标记更新即可代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int T, n, k;ll a[N];struct Node { ll l, r; ll minn;// 最小值 ll lazy; //向下更新懒标记} tr[N * 4];//由子节点更新父节点
2021-05-24 11:31:42
242
原创 acwing 3549 最长非递减子序列
题面题解(DP)代码#include<bits/stdc++.h>using namespace std;//111 222 1111 2222int main() { int n; scanf("%d", &n); int s1 = 0, s2 = 0, s3 = 0, s4 = 0; while (n--) { int x; scanf("%d", &x); if (x
2021-05-23 08:50:49
175
原创 acwing 3188 manacher算法
题面题解我们用mancher算法,可以在O(n) 求出一个串的最大回文串我们要将题中给定的串变为奇数串,比如abaca 就会变成 $#a#b#a#c#a^用一个p[i] 数组表示以si为中心的最大回文串的半径,那么最后求一个最大的半径-1,就是所求结果我们在计算p[i] 的时候枚举维护一个右端点最大的回文串,mr即为右端点,mid为这个回文串的中点情况1 :当枚举的si在回文串内,以si为中心的回文串在维护的回文串内部,那么它的长度就和p[j] 的长度一样情况2
2021-05-21 21:31:22
202
2
原创 eclipse 自动提示
自动提示设置Window—>Preferences---->Java—>Editor—>Content Assist设置成.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
2021-05-17 17:32:20
103
原创 acwing 1220 生命之树 (树形DP)
题面题解代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10, M = N * 2;int n;ll w[N];ll h[N], e[M], ne[M], idx;l
2021-05-17 10:54:47
173
原创 acwing 1192 奖金(拓扑排序)
题面题解跑一遍拓扑排序求出所有编号在图中的前后关系dist[i]:表示i点在拓扑图中离起点的最远距离(可能存在多起点),dist[起点] == 100,边的权值为1代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e4 + 10, M = 2 * N;int n, m;int h[N], ne[M], e[M], idx;int d[N];int
2021-05-11 20:06:20
174
原创 acwing 903 昂贵的聘礼 (最短路模型)
题面题解(最短路模型)建立一个超级源点0,从0建立一条边到每个物品,权值为物品的价值。代表花费多少钱就可以购买这个物品。若某个物品拥有替代品,代表从替代品建立一条边到这个物品,价值为替代的价值。 代表我有了这个替代品,那么还需要花费多少就能买这个物品。最后我们枚举等级区间,每次求最短路只能更新区间中的点,然后求一个最小值即可,注意这个等级区间一定要包含终点1,所有区间的左端点就是[ level[1]-m,level[1] ]代码#include<bits/stdc++.h&
2021-05-11 15:05:51
315
原创 acwing 920 最优乘车(最短路模型)
题面题解问题转化 :换乘多少次 可以转换为 乘坐过多少次车减1建图:在同一条路线中,任意一个在此路线上的车站均能沿着该路线的方向到达 后面的车站,权值都是1,表示只乘坐一次车 ;通过建图,由于权值均是1,使用bfs求出1号点到n号点最少乘过多少次车代码#include<bits/stdc++.h>using namespace std;const int N=510;int n,m;bool g[N][N];int dist[N];int stop[N];
2021-05-10 11:28:12
263
原创 acwing 1126 最小花费(单源最短路模型)
题面题解(最短路模型)代码#include<bits/stdc++.h>using namespace std;const int N=2100;int n,m,A,B;double g[N][N];double dist[N];bool st[N];void dijkstra(){ dist[A]=1; for(int i=0;i<n-1;i++){ int t=-1; for(int j=1;j<=n;j++){ if(!st[j]
2021-05-10 10:03:50
274
原创 acwing 1127 香甜的黄油(单源最短路)
题面题解代码#include<bits/stdc++.h>using namespace std;const int N=810,M=3000,INF=0x3f3f3f3f;int n,p,m;int h[N],e[M],ne[M],w[M],idx;int id[N];int dist[N];bool st[N];void add(int a,int b,int c){ e[idx]=b; w[idx]=c; ne[idx]=h[a]; h[a]=id
2021-05-09 21:27:50
197
原创 acwing 1128 信使(单源最短路)
题面题解(单源最短路)问题的转化:对于每个点,它接收到信的时间,等于它到指挥部的最短距离,因此只需要求 1号点到所有点的最短距离的最大值代码#include<bits/stdc++.h>using namespace std;const int N = 110, INF = 0x3f3f3f3f;int n, m;int dist[N][N];void floy() { for (int k = 1; k <= n; k++) { f
2021-05-09 17:28:08
228
原创 acwing 1129 热浪 (单源最短路)
题面题解(单源最短路)代码(spfa)#include<bits/stdc++.h>using namespace std;const int N = 2510, M = 6200 * 2 + 10;int n, m, S, T;int h[N], e[M], ne[M], w[M], idx;int dist[N];bool st[N];void add(int a, int b, int c) { e[idx] = b; w[idx] = c;
2021-05-09 16:09:12
163
原创 acwing 181 回转游戏(IDA*)
题面题解代码/* 对#进行编号 0 1 2 34 5 6 7 8 9 10 11 1213 14 15 16 17 18 19 20 21 22 23*/#include<bits/stdc++.h>using namespace std;const int N = 24;int q[N];int path[100];//八种操作方式int op[8][
2021-05-08 22:23:59
170
原创 acwing 180 排书(IDA*)
题面题解(IDA*)IDA*与A*算法思想相似,就是在迭代加深的基础上进行优化,当遍历当前节点时,如果当前深度 +预估正解深度 > 设定的最大深度 ,则提前退出分析正解枚举放到哪个位置:本质其实就是交换两个相邻两段(将区间lr插入到k之后的位置,相当于交换区间[l,r]和[r+1,k])代码#include<bits/stdc++.h>using namespace std;const int N = 15;int n;int q[N], w
2021-05-08 18:19:18
185
1
原创 acwing 171 送礼物(双向DFS)
题面题解(双向DFS)看给定数据范围,如果用01背包来做,时间复杂度是O(nv) ,v是231,肯定超时,我们考虑DFS来做,但是直接搜索状态就会有246,还是超时,正解采用双向DFS大体思想:我们先预处理出前n/2个物品所能组成的所有状态(选或不选),然后再DFS后n/2个物品,找出最大然后二分前面状态找出一个不超过m的最大值1.将所有物品按重量从小到大排序2.先将前k件物品能凑出的所有重量打表,然后排序并判重3.搜索剩下的N-k件物品的选择方式,然后在表中二分出不超过W的最大值
2021-05-07 21:41:14
155
原创 acwing 170 加成序列(迭代加深)
题面题解(迭代加深)迭代加深使用场景:当存在较长的分支时,而答案却在很短的分支。我们在搜索较长 的分支时会浪费大量的时间大体思想:设定一个最大的搜索层数,如果可以搜索到答案,直接退出, 如果无解,则增大最大的搜索层数分析我们可以确定的是第一个位置一定是1,第二个位置一定是2,然后开始搜索第三个位置可以是3,4…我们可以发现,可能存在一个序列1,2,3,4,5,6,…题中数据范围是n<=100,那么存在搜索分支达到100层,我们再估算正解,因为要求最小长度,
2021-05-07 20:09:31
155
原创 acwing 168 生日蛋糕(DFS剪枝)
题面题解蛋糕从下往上搜索,上表面积就是最底层的圆面积,求解过程注重 侧面积和体积即可代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N=25,INF=1e9;int n
2021-05-07 17:48:02
129
原创 acwing 167 木棒(DFS剪枝)
题面题解代码#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;const int N=70;int n;int w[N],sum,length;bool st[N];bool dfs(int u,int s,int strat){ if(u*lengt
2021-05-07 15:20:21
138
原创 acwing 166 数独(DFS剪枝)
题面题解通过位运算表示描绘出当前的局面,某一行某一列某一某一宫格均用1个长度是9为的二进制数表示,若当前位置是1表示该行该列或者该宫格可填入在选择当前需要填数的位置时,选择分支最少的格子state = row[x] & col[y] & cell[x / 3][y / 3]表示当前位置(x,y)可填数的状态,某二进制为是1表示可填该数代码#include<iostream>#include<cstdio>#include<strin
2021-05-07 09:15:24
203
原创 acwing 165 小猫爬山 (DFS剪枝)
题面题解剪枝分类dfs优化主要分成5类1、优化搜索顺序(大部分情况下,我们应该优先搜索分支较少的结点)2、排除等效冗余3、可行性剪枝4、最优性剪枝5、记忆化搜索做法依次遍历所有的猫,通过第u只猫往现有的第k个辆车中放来遍历所有情况,(可以放入第 i 辆车,也可以新开一辆车放入)优化优先放重的猫,优化搜索顺序,因为先放重的,可以减少接下来的分支,使遍历情况减少当前猫放入已经超出最大限制,就不再进行遍历,可行性剪枝新开车的数量大于答案的值,接下来肯定不是答案,最优
2021-05-06 19:20:58
170
原创 acwing 1118分成互质数(DFS搜索顺序)
题面题解枚举组,开始将第一个数放入第一组,然后判断下一个数能否放到这个组,如果能就继续dfs下一个数,如果不能就新开一个组,从头开始扫描没有被放的数能否放到新的组代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;const int N=11;int n;
2021-04-29 19:39:00
139
原创 acwing 1117 单词接龙 (dfs搜索顺序)
题面题解(DFS搜索顺序)两个字符串拼接,重合部分越短,拼接起来的字符串就越长,因此我们处理出所有单词两两拼接起来重合部分最短且符合条件的最小重合长度 , g[i][j]表示第i个单词和第j个单词重合的最小长度我们从给定的字母符合的单词开始做dfs,因为是外部搜索,所以要状态还原代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include&
2021-04-29 16:36:17
142
原创 acwing 1116 马走日 (DFS顺序搜索)
题面题解因为是每个状态的顺序搜索,所以dfs之后要记得还原代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;const int N=10;int t,n,m,sx,sy;bool st[N][N];int res;int dx[8] = {-2,
2021-04-27 22:18:29
165
原创 acwing 1113红与黑 (Flood Fill 模型)
题面题解Flood Fill 模型,用dfs来求连通块,因为是图内部,不需要还远状态代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;const int N=25;int n,m;char g[N][N];bool st[N][N];int dx
2021-04-27 20:59:44
171
原创 算法竞赛进阶指南---(A*)第k短路
题面题解(A*)对于第一次出队的为最短路,第K次出队的就是第K短路,我们采用反向建边,dijkstra预处理终点到每个点的距离,将每个点到终点的距离作为估计值代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<queue>using namespace std;typ
2021-04-26 19:47:48
89
原创 算法竞赛进阶指南---(A*) 八数码
题面题解(A*)A*算法在最小步数模型中,当状态数较多时,不能直接用BFS来做,我们就可以考虑A*算法来减少一些没必要的搜索状态引入一个估值函数,用来估计某个点到达终点的距离。记f是估值函数,g是真实值,那么f(state) <= g(state),越接近越好 , 记dist是从起点到state状态的步数;利用的是优先队列,排序依据是dist[state] + f(state),当终点状态第一次出队时,就是最小步数。本题对于八数码问题,我们知道最终状态是序列12345678x
2021-04-26 17:48:43
172
原创 acwing 190 字串变化 (双向BFS)
题面题解双向BFS一般用于最小步数模型,当我们变化的状态较多时,直接用BFS搜索会TLE或MLE做法我们开两个队列,分别将起始状态和终点状态加入队列,每次取队列元素少的拓展,如果有解,那么首尾拓展的状态一定会在中间相遇代码#include <cstring>#include <iostream>#include <algorithm>#include <unordered_map>#include <queue>
2021-04-23 21:42:47
133
原创 acwing 1107 魔板 (最小步数模型)
题面题解和八数码问题类似,都是将初始状态变化成最终状态所花费的最小步数,我们可以将每个状态看成一个点进行更新即可代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<queue>#include<unordered_map>using namespace s
2021-04-23 15:42:55
188
原创 acwing 175 电路维修(双端队列广搜)
题面题解(双端队列广搜)双端队列双端队列主要解决图中边的权值只有0或者1的最短路问题操作每次从队头取出元素,并进行拓展其他元素时若拓展某一元素的边权是0,则将该元素插入到队头若拓展某一元素的边权是1,则将该元素插入到队尾只有在最后出队时,才能确定这个点的最小值(没有出队时,其他点可能还会更新这个点的距离)代码解释我们可以将直接能走的点的步数看作是0,需要变化的步数看作是1,这样问题就转化成了从起点开始到终点最小的步数,因为起点是(0,0),我们移动每次都是按照方格的斜
2021-04-23 11:02:53
154
原创 acwing 173 矩阵距离(多源BFS)
题面题解这道题让我们找到每一个点到多个起点(这里指1)的最近距离,用一般的做法就是用每一个起点去更新其他点的距离,然后更新的距离去一个最小值,O(n3),会超时我们可以给多个起点建立一个虚拟的节点,虚拟节点到每个起点的距离都是0,那么我们就可以转化成这个虚拟节点到所有点的最小距离,在写代码时,我们只开始将所有起点入队即可代码#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PI
2021-04-22 21:26:01
248
原创 acwing 1100 抓住那头牛(最短路模型)
题面题解我们可以将坐标轴看成一个图,从起点n开始,可以到达n+1,n-1,n*2的点,要求n到k的最短距离,那么我们可以设到达每个点的距离是1,然后用bfs进行搜索,搜索到k时,dist[k]就是n到k的最短距离代码#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, k;int q[N];int dist[N];int bfs() { memset(dist, -
2021-04-22 19:24:20
190
原创 acwing 188 武士分度的牛(最短路模型)
题面题解从起点开始,步数为0,然后BFS能走到’日’的方向,更新距离即可代码#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 160;int n, m;char g[N][N];PII q[N * N];int dist[N][N];int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};int dy[]
2021-04-21 21:29:40
104
原创 acwing 1076 迷宫问题(最短路模型)
题面题解(最短路模型)迷宫问题+输出路径,因为每个点之间的距离都是1,所以用BFS搜索出来的结果就是最短的距离,我们新开一个数组,然后我们从终点开始最终搜索到起点,记录每个点的前一个点是从哪转移过来的,最后从(0,0)点遍历一遍即可代码#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 1010;int n;int g[N][N];PII
2021-04-21 21:04:35
246
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人