![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
跟着龙之介学算法
包含算法学习心得以及各种题解 包含 Leecode每日一题题解,CF题解,OJ题解等
游戏开发龙之介
自跨专业学编程的萌新
展开
-
归并排序概念算法思想复杂度和实现
概念将两个有序数列合并成一个有序数列,我们称之为“归并”。算法思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。复杂度归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排原创 2021-12-02 12:00:00 · 111 阅读 · 0 评论 -
设定1000,0000范围以内,把阿拉伯数字转换为汉语数字
一一十一一百一十一一千一百一十一一万一千一百一十一一十一万一千一百一十一一百一十一万一千一百一十一一千一百一十一万一千一百一十一可以发现每一千是一个单位。所以我们可以把多数分成多个一千去单独处理。中间再额外添加一个万即可。所以就可以将问题转换成如何处理一个一万以内的数字的阿拉伯表示形式分情况讨论可以发现。1000 一千1100 一千一百1010 一千零一十这也可以分成三个部分 高位 +零+低位其中零和低位要么同时出现[1010]要么不出现[1100]所以我们只需要先依次把原创 2022-03-04 18:03:26 · 284 阅读 · 0 评论 -
370A. Rook, Bishop and King codeforce题解
题目链接思路:给个8*8的棋盘,有三种棋,给你初始位置和目标位置,输出三种棋到达目标的最小步数。我们先看rook,由于他可以横着竖着走任意距离,所以,他最多走两步(一横一竖),最少走一步(如果竖行或者横行就在他的位置)再看Bishop,他只能斜着走,说明他可能会走不到目标点(要么他只能走黑格子要么只能走白格子),然后走一步还是两步的原理和rook一样了最后看King,由于可以走八个方向。所以他最优解就是每次往目标点最近距离移动即可,那么值为 max(abs(r1 - r2), abs(c1 - c2原创 2021-08-20 13:50:07 · 210 阅读 · 0 评论 -
1255B. Fridge Lockers Codeforce题解
原题链接思路:这题问的是,给你n个冰箱,每个冰箱重量为a[i],冰箱由几条链连接,解锁冰箱的条件是解锁这个冰箱的链,冰箱的主人拥有他的冰箱所连接的链的钥匙,故他自己可以解锁冰箱,但是其他人需要合作解锁。给你m条边,如何才能使得所有人的冰箱都是私有的(即自己可以开自己的冰箱但其他人不能直接开至少需要合作),问最小花费多少代价(连一条边i-j的代价为a[i]+a[j]),并输出代价以及连的边。如果无解输出-1所以我们很容易知道,其实最优解就是每个冰箱两两链接成环(测试样例)。那么我们考虑三个情况情况1原创 2021-08-20 12:00:09 · 184 阅读 · 0 评论 -
1560C. Infinity Table Codeforce8.18比赛题解
原题链接思路:这题是问一个矩阵由一直规律的画j形递增数组组成1 12 12543 436987问给一个数组,求他在哪行哪列这题其实就是数列,我们从上往下看矩阵的每行的第一个元素规律是1 (+3) 4 (+5) 9 (+7) 16 …(+t) num所以需要初始化维护两个集合一个是每行第一个数字的索引。h[1]=1 h[2]=4 h[3]=9…一个是每行所构成的集合也就是J形的集合有多少个元素 s[1]=1 s[2]=3 s[3]=5…然后就能通过这两原创 2021-08-19 14:12:20 · 122 阅读 · 0 评论 -
1560B. Who‘s Opposite? Codeforce8.19比赛题解
题目链接思路:问有偶数个人围成一圈,所以必然会有两两能成对(对角线相连),现在不知道具体有多少个人,给出a,b,c三个数,表示,a和b是一对,问c和谁成对。如果不成对输出-1两个数成对就说明他们直接的距离恰好是总人数的两倍,由于a和b成对,则原则上总人数也就是最大的数 maxa=abs(a-b)*2;1 由于a,b,c是三个数,所以至少由四个人组成。2 并且a,b,c不能大于maxa的 (abs(a-b)可能会存在这个情况)3 否则就是成立的情况,那么就判断c+abs(a-b)的是原创 2021-08-19 12:09:07 · 168 阅读 · 1 评论 -
1560A. Dislike of Threes codeforce比赛8.19题解
原题链接思路:有一个序列,由从1开始递增,且不包括能整除3或者个位有3的数字。如:1,2,4,5,6,7,8,11,14,16…(索引从1开始)输入一个k,输出这个序列第k个数这题就是记忆化存储,如果之前存过这个索引直接返回,否则就去按规则去找。 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const原创 2021-08-19 11:44:07 · 328 阅读 · 0 评论 -
1492 C. Long Jumps--Codeforce题解
题目链接思路:题意是有n个位置上面有个数字a[i],你可以选择其中n个数中的一个作为起始位置。然后你会往后跳a[i]个索引。走到>n就结束,最后分数为他走过的路径中的a[i]的和。状态表示:dp[i] 他走到i这个点的位置的最高得分。状态计算: 首先dp[i]=a[i] , 若 i+a[i] < n 则说明i可以再走一段到 i+a[i]并加上dp[i+a[i]]的分数则dp[i]+=dp[i+a[i]]; 我们只需要从后往前遍历就能保证不重不漏.#include <ios原创 2021-08-17 14:34:12 · 86 阅读 · 0 评论 -
1033A. King Escape--Codeforce 题解
原题链接这题就是国王一直不动(可以往八个方向走无限远),王后可以一直动,现在要使王后移动到指定位置且不会被国王的可以移动的位置相遇。这题和正常的走迷宫问题一样,只是路障需要自己建立(以国王为初始点往八个方向伸长),并且王后是可以往八个方向走。简单的BFS模板搞定#include<cstring>#include<math.h>#include<iostream>#include <climits>#include <queue>us原创 2021-08-17 13:03:06 · 271 阅读 · 0 评论 -
D1. Mocha and Diana (Easy Version) 8.15Codeforce 比赛题解
原题链接思路:非常暴力的题,首先先把Mocha和Diana分别自己的边处理好并查集。然后枚举所有边,如果可以加到Mocha也可以加到Diana就加上,否则不加。#include<cstring>#include<math.h>#include<iostream>#include <climits>using namespace std;typedef long long LL;int p1[100005],p2[100005];int f原创 2021-08-16 14:08:58 · 106 阅读 · 0 评论 -
A. Mocha and Math 8-15 Codeforce比赛题解
题目链接思路:题目是给你一个数组,你可以选择一个一个区间[L,R]使得 a[L]=a[L]&a[R] ,a[L+1]=a[L+1]&a[R-1],a[L+2]=a[L+2]&a[R-2]…a[R]=a[R]&a[L];问你经过任意上述次操作使得最大值最小。其实我们可以一直二分区间L,R来使得所有的值都变为maxa=a[1]&[2]&a[3]&…&a[n];假设n=7a[1] a[2] a[3] a[4] a[5]原创 2021-08-16 13:46:33 · 95 阅读 · 0 评论 -
B. Mocha and Red and Blue 8.15CodeForce周赛题解
题目链接思路:由于是把所有’?‘号给变成B或者R,所以这题用多源BFS即可,初始化把所有非’?‘的位置入队,对于每个出队元素,将其两边的’?‘变成与出队元素相反的元素即可。但是需要特判一下,如果开始队列是空,说明全是’?’,你只需要随机找一个点变成任意字母即可,我这里找的是中点#include<iostream>#include<cstring>#include<algorithm>#include <queue> using namespac原创 2021-08-16 11:40:16 · 144 阅读 · 0 评论 -
C. Mocha and Hiking 8.16codeforce比赛题解
题目链接思路:这个图是由两部分组成假设是n情况1 {首先是会有1->2->3->4…->n}情况2 {其次对于ai如果a[i]==1 则会有n+1->i如果a[i]==0 则会有i->n+1}问这个图能不能每个点都只走一次,全部走完。我们需要利用条件一,首先1到n是可以走完的,我们只需要判断一 :n+1能不能到1 (a[1]==1) : n+1->1->2->3->…->n二 : n能不能到n+1 (a[n原创 2021-08-16 11:30:34 · 112 阅读 · 0 评论 -
1162 Eddy‘s picture 题解
题目链接思路:最小生成树问题,由于题目只给出n个点,所有你需要手动连n*(n-1)条边,每个点用pair<double,double> 存,然后自定义结构体存所有边,然后跑一遍Kruskal。#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#define x first#define y s原创 2021-08-14 17:36:37 · 57 阅读 · 0 评论 -
A Walk Through the Forest 题解
hdoj原题链接思路:这道题不同于以前简单的最短路径而且非常的难以理解题目在说什么,它要求的是:如果A到B的过程中, 假如存在一个B点到终点(2号点)的路径比所有A到终点(2号点)的路径要短。即 dist[B]>distance[A]; 那么A->B->2的路径算一条,计算这样的路径的条数。我们不妨先算出。2号点到所有点的最短距离(dijkstra模板题),然后再来记忆化搜索(cnt[i] 表示走到i点的这样的路径有多少跳)所有满足这样的条件的个数即为它的路径的个数…(2号点是终原创 2021-08-13 11:27:25 · 65 阅读 · 0 评论 -
7.31 1003鸽子 百度之星 题解
原题链接dp的思维方式,初始化所有q为0x3f 其实就是01背包问题,换或者不换。 状态表示:dp[i] 第i台电脑坏的不执行条数 状态计算 假设i为当前电脑j为交换电脑 不换:dp[i]=dp[i]+1 换:dp[i]=dp[j] 但是由于L R是会交换的。所以dp[L] dp[R]是需要先存下来才换。#include <iostrea原创 2021-08-13 11:27:31 · 112 阅读 · 0 评论 -
8.7 1004 环上游走 百度之星题解
原题链接#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100;int res = 0;bool st[N];int n;void dfs(int times,int node){ //如果走的次数能达到上限,则表示前面的步骤都已经合法了,此时让res++,并return if (times =原创 2021-08-12 11:47:19 · 141 阅读 · 0 评论 -
8.1 1001签到 百度之星题解
原题链接#include<iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;long long qmi(long long a,long long k,long long mod){ long long res = 1; while (k > 0){ if ((k % 2) != 0){原创 2021-08-12 10:39:13 · 65 阅读 · 0 评论 -
7.31 1003鸽子(TLE) 百度之星 题解
Problem Description 你的机房共有 nnn 台电脑,但是第 kkk 台电脑坏了。你的老师给你 mmm 次要求,每次要求你将第 uiu_iui 和 viv_ivi 台电脑交换,这样坏的电脑就可能会被交换到一个新的位置。但由于你希望进行暗箱操作,你可以拒绝执行其中的若干条要求,使得坏的电脑最终交换到 jjj 号位置。由于骗过老师很累,请对于 j=1...nj=1...nj=1...n 求出最少可能的不执行要求条数,使得坏的电脑在第 jjj 个位置。 Input原创 2021-08-12 00:13:51 · 150 阅读 · 0 评论 -
7.26 1001度度熊保护村庄 百度之星 题解
Problem Description 哗啦啦村袭击了喵哈哈村!度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。但是度度熊发现,这是一场旷日持久的战斗,所以度度熊决定要以逸待劳,保存尽量多的体力,去迎战哗啦啦村的战士。于是度度熊决定派尽量多的人去休息,但是同时也不能松懈对喵哈哈村的保护。换句话而言,度度熊希望尽量多的人休息,而且存在一个包围圈由剩下的人组成,且能够恰好的包围住喵哈哈村的所有住房(包括边界)原创 2021-08-12 00:12:22 · 113 阅读 · 0 评论 -
7.26 1002度度熊的王国战略 百度之星 题解
Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士。所以这一场战争,将会十分艰难。为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦族。第一步就是应该使得哗啦啦族内部不能同心齐力,需要内部有间隙。哗啦啦族一共有n个将领,他们一共有m个强关系,摧毁每一个强关系都需要一定的代价。现在度度熊命令你需要摧毁一些强关系,使得内部的将领,不能通过这些强关系,连成一个完整的连通块,以保证战原创 2021-08-12 00:11:29 · 68 阅读 · 0 评论 -
7.26 1003度度熊与邪恶大魔王 百度之星题解
Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。如果怪兽的生命值降为0或以下,那么怪兽就会被消灭。当然每个技能都可以使用无限次。请问度度熊原创 2021-08-12 00:10:36 · 84 阅读 · 0 评论 -
7.26 1004度度熊的午饭时光 百度之星题解
Problem Description 度度熊最期待每天的午饭时光,因为早饭菜品清淡,晚饭减肥不敢吃太多(胖纸的忧伤T.T)。百度食堂的午餐超级丰富,祖国各大菜系应有尽有,度度熊在每个窗口都有爱吃的菜品,而且他还为喜爱的菜品打了分,吃货的情怀呀(>.<)。但是,好吃的饭菜总是很贵,每天的午饭预算有限,请帮度度熊算一算,怎样打饭才能买到的最好吃的饭菜?(不超过预算、不重样、午餐等分最高的情况下,选择菜品序号加和最小,加和相等时字典序最小的组合) Input 第一原创 2021-08-12 00:09:03 · 146 阅读 · 0 评论 -
8.7 1002网格路径 百度之星 题解
网格路径 Accepts: 734Submissions: 3776Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Problem Description给定一张 n×nn\times nn×n 的网格图,有些格子能走,有些格子不能走,左上角的格子坐标为 (1,1)(1,1)(1,1),右下角的格子坐标为 (n,n)(n,n)(n,n)。问最多可以找到多少条从 (1,1)(1,1).原创 2021-08-12 00:07:40 · 221 阅读 · 0 评论 -
6836Battle for Wosneth 百度之星复赛题 题解
原题链接思路:题目求的是alice生命变化期望。首先我们先来理解一下期望离散型的期望就是这样 xk取值与对应的概率pk的乘积之和那么按照这个模板去思考即可第一步:首先alice打中bob的概率是p,伤害为1 ,那么alice打中bob的期望是p1由于bob有m血, 故alice有m/p次命中bob(完整的回合(alice–>bob,bob–>alice)共 m / p − 1 回合。(最后一次B已经牺牲,无法攻击A,构不成一个完整的回合)现在,我们已经分析出了,整个对局是由原创 2021-08-12 00:05:11 · 93 阅读 · 0 评论 -
CodeForce使用说明超详细!!!!!
CodeForce用法说明–龙之介一,搜索题目假设我们需要搜索600E这题,只需强行改网址https://codeforces.com/problemset/problem/600/E二,如何按照标签找题三.题目排序按照通过人数按照难度四,如何看题解?五,题目在哪?比赛在哪?六,如何写代码七,提交代码八,如何看样例?在题目界面点击进行案例查看然后点击Click(小tips:建议少看,多锻炼自己的分析题目能力,做到完美。因为你只是会觉得模糊一个大概随便改一下原创 2021-08-12 00:00:20 · 17291 阅读 · 6 评论 -
755A. PolandBall and Hypothesis CodeForce 题解
原题链接思路:由于nm+1 假设m=n-2易得 n(n-2)+1=n2-2*n+1=(n-1)2 (n-1不为素数)。 若是n<=2的情况时,n1,则1*3+1=4 m取3 n2 2*4+1=9 m取4#include <iostream>#include <cstring>#include &l原创 2021-08-11 23:56:25 · 88 阅读 · 0 评论 -
111A. Petya and Inequiations Codeforce题解
原题链接思路:题意大概是找出n个数,使得 a12 + a22 + … + an2 ≥ xa1 + a2 + … + an ≤ y由于 (x1+x2)2>x12+x2^2故,只需要使一个数最大,其他数为1就能得出结果。 这个数为y-n+1 若 (y<n||(y - n + 1) * (y - n + 1) + n - 1 < x)原创 2021-08-11 23:55:26 · 132 阅读 · 0 评论 -
1249B1. Books Exchange (easy version) CodeForce题解
原题链接思路:题意是有n个小孩,每天每个小孩都会给书给某一个小孩,依次循环,问每个小孩几天后会得到他自己的书。由于是一个一直传递的过程,实际上最后图的分布是几个环,(自己给自己就是自环),我们只需要维护一个并查集,根节点存他在第几天可以收到自己的书droot,答案就是每个点找自己根节点的值存的dfind(x)#include<iostream>using namespace std;const int N = 210;int p[N],d[N];int find(int x) //原创 2021-08-11 23:53:56 · 149 阅读 · 0 评论 -
115A. Party CodeForce题解
原题链接思路:这题问的是将n个人分成res组,且每个组不存在直接上下级关系。所以我们只需要求出每棵树里面最深的深度就是res。 用并查集来求。我用两种方法,状态压缩和不状态压缩都做一遍,由于这题需要求深度,状态压缩是延迟更新 需要在求res之前对所有i都额外一次压缩//方法一#include <iostream>#include <cstring>#include <algorithm>using namespace st原创 2021-08-11 23:52:27 · 132 阅读 · 0 评论 -
1055A. Metro CodeForce 题解
原题链接思路:就是Bob在1号车站,问能不能到Alice家,要么Bob直接去Alice的车站,要么如果他的火车没有停在那里,他需要尽快换车去相反的方向。不难证明他可能只需要换车一次。如果两种选择都不可能,那么Bob就不能坐火车来Alice家了。 是否能在第二条线到,只需要判断是否存在i(s<=i<=n)满足a[i]=b[i]=1这样就能换乘,并且也能做反向路线到Alice家#include<iostream>#include <cstring>#include &原创 2021-08-11 23:48:13 · 88 阅读 · 0 评论 -
A. New Year Transportation Codeforce 题解
题目链接思路:这是格子图,输入ai为在i这个格子之后会往后走几格。问你在第一个格子,能否到第t个格子。用dfs从1号格子搜,搜到t就return true,如果搜过了t就return false#include<iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 30010;int a[N];bool getpeach(int cur,int ta原创 2021-08-11 23:43:36 · 117 阅读 · 0 评论 -
948A. Protect Sheep CodeForce 题解
原题链接思路:题目问的是如何放狗才能使得狼无法走到羊,完全可以暴力放,每个羊的四周都放狼就行了。如果狼和羊刚好相邻则说明防不胜防直接炸裂输出NO#include<iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 510;char g[N][N];int main(){ int n,m;原创 2021-08-11 23:45:19 · 83 阅读 · 0 评论 -
1020B. Badge CodeForce题解
题目链接思路:大致意思是问从i号点一直走,直到走到两次相同的点,就输出这个点。可以直接dfs爆搜一遍或者while爆搜也行。#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;int p[N];bool st[N];int res;void dfs(int x){ x=p[x]; if(st[x]原创 2021-08-11 23:29:58 · 287 阅读 · 0 评论 -
最小生成树(prim和Kruskal)
今天来讲解最小生成树[无向图]实际上是有有向图的最小生成树问题,不过那个模型比较难prim算法:和dijkstra的写法真的很像大概流程每次找到距离源点最短的边,然后连过去算法模板:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 110;int g[N][N];int dist[N];bool st[N];.原创 2021-07-14 12:35:25 · 72 阅读 · 0 评论 -
单源最短路问题(dijkstra,bfs,bellman-ford,spfa)
单源最短路问题解决的模型是从某一源点到所有其他连通点的最短距离[此图的源点是1]dikstra 朴素版 复杂度o(n^2)流程是每次找到距离源点最近的一个点 o(n)*然后用这个点更新其他点的距离 o(n)||o((n^2)由于“用这个点更新其他点的距离”的时间是o(n),但是实际上很多情况下是不需要更新那么多边或者说是无法更新的所以就诞生了堆优化版本的dijkstradijkstra堆优化版 复杂度(m+nlogn) m条边要更新,n个点堆的时间是nlog使用优先原创 2021-07-10 11:57:06 · 259 阅读 · 0 评论 -
字典树Trim详解+相关例题---龙之介算法基础课
字典树,顾名思义,是关于“字典”的一棵树。 即:它是对于字典的一种存储方式(所以是一种数据结构而不是算法)。 这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径,路径中每条边的字母连起来就是一个单词。实际上不一定是字典,也可以是二进制哦我们要理解一个概念,字典树是一种数据结构,类似字典的查找很快的结构。故它拥有insert插入和qurey查找功能。需要注意的是,有些值可能会在到达树的末梢之前就可以返回了[也就是说不一定是一条边一个字母],例如:OK,理顺了概念,直到他是Wh.原创 2021-05-23 13:33:43 · 694 阅读 · 0 评论 -
多源BFS 理解学习+代码模板---跟龙之介学算法
单源BFS是广搜,基于队列的思想,找到初始结点入队,然后把邻接点入队,直到搜索完。而多源BFS就是,可以多个源点入队,然后每次都将当前入队的所有结点的邻边入队。这次我们核心围绕多源BFS分几种体型来深入探讨。注:本教学需要先学习 队列和BFS 才能听懂。我们实际举个例子:假设有个病毒区,每天病毒会传播到临近区域。现在我们模拟一下假设 0是正常区,1是病毒区。粗体表示今天被传播的临近区【入队列】斜体表示之前被传播过多的病毒区【出队列了】day0 0 0 0 1 0 1 0.原创 2021-05-12 22:30:16 · 159 阅读 · 0 评论