- 博客(77)
- 收藏
- 关注
原创 5538. 统计子树中城市之间最大距离
传送门解题思路:枚举子集,每次枚举都先判断是否可以相互到达。主要是判断方法:若a,b,c,d,e,…,z可以相互到达,那么必存在一个点,去除这个点后剩下点可以相互到达,且这个点与剩下的这些点中至少一个相连接。class Solution {public: bool vis[20][20]; int dis[20][20]; int sum[20]; int dp[(1<<15)+10]; void check(vector<int>
2020-10-11 17:26:52
213
原创 5514. 检查字符串是否可以通过排序子字符串得到另一个字符串
给你两个字符串 s 和 t ,请你通过若干次以下操作将字符串 s 转化成字符串 t :选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。比方说,对下划线所示的子字符串进行操作可以由 “14234” 得到 “12344” 。如果可以将字符串 s 变成 t ,返回 true 。否则,返回 false 。一个 子字符串 定义为一个字符串中连续的若干字符。解题思路:参考大佬的思路:我们可以发现任意两个数a[i],a[j],若a[i]<aj,无论怎么变,a[i]都不能到a[j]后去
2020-09-13 21:47:28
282
原创 LCP 15:秋叶收藏集(动态规划||前缀和)
小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。示例 1:输入:leaves = “rrryyyrryyyr
2020-09-13 21:33:32
237
原创 旅行(最大生成树)
DK 有一个无向图 G,这个无向图有 n 个点 m 条边参考出题人的题解:可以发现,对答案有贡献的边肯定是最大生成树上的边,那么可以将这些边先拉出来,用kural算法求最大生成树即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;int n,m;struct Node{ int u,v,val; friend bool operator <(const Node& a,const
2020-09-12 11:18:15
155
原创 306-累加数
累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。示例 1:输入: “112358”输出: true解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3
2020-09-11 12:52:26
209
原创 10.正则表达式
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”
2020-09-08 21:59:23
412
原创 组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]解题思路:一开始虽然知道是暴搜,但是由于在每次dfs过程中都用了一个for循环控制搜索,结果会导致有重复,其实只需要每次dfs过程中枚举当前这位选还是不选即可。class Solution {public: vector<vector<int>> p;
2020-09-08 21:38:33
120
原创 前k高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。传送门你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺序返回答案。思路:按照大佬思路:用最小堆,将堆内元素个数维护成k,每次加入元素的出现次数与最小堆堆顶比较,若大于则将堆顶元素出堆,加入该元素。class Solution {public:
2020-09-07 13:14:24
178
原创 预测赢家(博弈论,动态规划)
思路:动态规划:这里我们定义dp[i][j]为[i,j]中玩家1比玩家2最多能获得的分数.首先直观可知dp[i][i]=nums[i].[i,j]区间内玩家有两种操作方式:1.先拿nums[j],玩家1获得了nums[j].此时dp[i][j-1]就是玩家2比玩家1最多能获得的分数,此时玩家1比玩家2最多能获得的分数就是nums[j]-dp[i][j-1]2.先拿nums[i],玩家1获得了nums[i].此时dp[i+1][j]就是玩家2比玩家1最多能获得的分数,此时玩家1比玩家2最多能获得的分.
2020-09-01 10:00:26
888
原创 钓鱼
链接在一条水平路边,有n个钓鱼湖,从左到右编号为1,2,…,n。佳佳有H个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从1出发,向右走,有选择的在一些湖边停留一定的时间(是5分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。佳佳从第i个湖到第i+1个湖需要走5\times T_i5×Ti 分钟路,还测出在第i个湖停留,第一个5分钟可以钓到F_iFi 条鱼,以后每再钓5分钟,可以钓到的鱼量减少D_iDi ,若减少后的鱼量小于0,则减少后的鱼量为0。为了简化问题,佳佳假定没有其他人钓鱼
2020-08-31 22:32:50
720
1
原创 家庭作业
传送门老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为 10,要求在 6 天内交,那么要想拿到这 10 学分,就必须在第 6 天结束前交。每个作业的完成时间都是只有一天。例如,假设有 7 次作业的学分和完成时间如下:思路:参照网上的题解,采用贪心做法,将这些作业先安装学分从大到小进行排序,接着每次寻找距离截至日期最近有空闲的日子完成该作业并标记,这部分可以采用并查集完成。#include<bits
2020-08-31 22:29:04
387
原创 马拉车算法模板
最近遇到几道回文字符串的题目都不太记得,来记录一下。首先我们需要预处理字符串例如abba,我们需要处理为:@#a#b#b#a# int init(string& s) { str="@#"; for(int i=0;i<s.size();++i) { str+=s[i]; str+='#'; } return str.size();//返回处理后的
2020-08-29 11:08:26
203
原创 查找大小为M的最新分组
解题思路:参照大佬的题解,每次添加的时候一共有三种情况1.左右都为空2.左为空或者右为空3.左右都不为空接着跟新link数组即可class Solution {public: int maxz; int findLatestStep(vector<int>& arr, int m) { maxz=arr.size(); vector<int> g(maxz+3,1); int ans=-1; .
2020-08-28 20:27:29
169
原创 得到目标数组的最少函数调用次数
把每个数看成二进制数,每位的1都是由操作1而得来的,故我们可以统计每位上1的数量来计算操作一的次数,操作二的次数为最大数所需要的右移次数class Solution {public: int minOperations(vector<int>& nums) { int maxz=0; int ans=0; for(auto u:nums) { int h=0; .
2020-08-23 21:07:42
172
原创 2020-08-14
传送门来源:牛客网qn是个特别可爱的小哥哥,qy是个特别好的小姐姐,他们两个是一对好朋友 [ cp (划掉~)又是一年嘤花烂漫时,小qn于是就邀请了qy去嘤花盛开的地方去玩。当qy和qn来到了田野里时,qy惊奇的发现,嘤花花瓣以肉眼可见的速度从树上长了出来。仔细看看的话,花瓣实际上是以一定规律长出来的,而且,每次张成新的花瓣的时候,上一次的花瓣就会都落到地上,而且不会消失。花瓣生长的规律是,当次数大于等于2时,第i次长出来的花瓣个数和上一次张出来的花瓣个数的差是斐波那契数列的第i-1项。初始的时候
2020-08-14 21:58:07
493
原创 选择最佳路径
有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。已知城市中共包含 n 个车站(编号1~n)以及 m 条公交线路。每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。琪琪的朋友住在 s 号车站附近。琪琪可以在任何车站选择换乘其它公共汽车。请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。输入格式输入包含多组测试数据。每组
2020-08-07 21:32:24
597
原创 毒瘤(位运算,贪心)
传送门思路:由异或的性质可以知道,要想异或后的值最大,那么每一位的异或后尽可能多的是1,所以我们可以提前预处理中l,r区间中第i位有多少个1,如果数量多与不是1的,那么答案这位就是0#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+10;int sum[maxn][33];int a[maxn];int n,m;int main(){ ios::sync_
2020-08-06 11:13:59
206
原创 购物(动态规划)
传送门在遥远的东方,有一家糖果专卖店。这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元。现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖果,也可以选择不买糖果,但是最多买m个。(因为最多只生产m个)买来糖果以后,你可以选择吃掉糖果或者留着之后再吃。糖果不会过期,你需要保证这n天中每天你都能吃到至少一个糖果。这家店的老板看你经常去光顾这家店,感到非常生气。(因为他不能好好睡觉了)于是他会额外的要求你支付点钱。具体来说,你在某一天购买了
2020-08-06 10:50:06
467
原创 2020-08-06
传送门思路:我们可以表示出红色部分的面积,可以发现当两个小圆半径相等的时候,红色部分面积最大,所以二分枚举验证即可,精度要求较大。#include<bits/stdc++.h>using namespace std;double pi=acos(-1);double cal(double x){ return pi*x*x/4;}double s;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie
2020-08-06 10:22:56
127
原创 着色方案(记忆化搜索)
传送门有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块。 所有油漆刚好足够涂满所有木块,即c1+c2+…+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案。输入描述:第一行为一个正整数k,第二行包含k个整数c1, c2, … , ck。输出描述:输出一个整数,即方案总数模1,000,000,007的结果。示例1输入复制31 2 3输出复制101<=k<=15 ,1<
2020-08-06 10:06:44
275
原创 Max power(动态规划)
小卤蛋刚把dnf的技能点重新洗了一遍,现在他要重新加点,假设他的技能树一共有n层,第i层有n-i+1个技能,每个技能只能够学习一次。除了第1层的技能可以直接学习外,其他技能学习都要学习前置技能,即你要学习第i(i>=2)层第j列的技能,那么你要先学习第i-1层的第j列和第j+1列的技能。每个技能学习后都会获得一定的战力加成。现在小卤蛋有m个技能点,一个技能点可以学习一个技能,他想知道加完点后他可以获得的最大战力加成为多少。思路:由于选取某个点受其右上方影响,故我们应该从右向左枚举,dp[
2020-08-02 22:33:52
567
原创 异或路径(dfs,点贡献)
传送门思路:从题目中我们可以很明显知道要想知道某点是否对答案有贡献,那么只要判断在最短路中经过该点的次数。这里借鉴了一个大佬的思路:首先通过dfs可以求出树中每个点子树的个数,那么经过某个点的三种情况如下(1)该点的父亲节点到该点及其子节点(2)该店的子节点到该点及父节点(3)该点到剩下n-1个节点(1)情况可以计算该点及全部子树大小z,经过该点(n-z)*z(2)情况可以分别计算该点子数大小k,经过该点(n-k)*k(3)情况 n-1最后由于i->j及j->i重复了,所.
2020-08-02 21:58:34
200
原创 兔子的区间密码(位运算,结论题)
链接:https://ac.nowcoder.com/acm/problem/20860来源:牛客网有一只可爱的兔子被困在了密室了,密室里有两个数字,还有一行字:只有解开密码,才能够出去。可爱的兔子摸索了好久,发现密室里的两个数字是表示的是一个区间[L,R]而密码是这个区间中任意选择两个(可以相同的)整数后异或的最大值。比如给了区间[2,5] 那么就有2 3 4 5这些数,其中 2 xor 5=7最大 所以密码就是7。兔子立马解开了密室的门,发现门外还是一个门,而且数字越来越大,兔子没有办法了
2020-08-02 20:54:02
383
原创 我不爱她
链接:终于活成了自己讨厌的样子。天空仍灿烂,它爱着大海。你喜欢大海,我爱过你。世界上充满了巧合。我们把每句话当成一个字符串,我们定义a对b的巧合值为a的最长后缀的长度并且它是恰好是b的前缀,这里的后缀或者前缀包括字符串的本身。比如字符串“天空仍灿烂她喜欢大海”对“她喜欢大海我不爱她了我爱的只是与她初见时蔚蓝的天空”的巧合值为5,而字符串“她喜欢大海我不爱她了我爱的只是与她初见时蔚蓝的天空”对“天空仍灿烂她喜欢大海”的巧合值为2。思路:首先把每个字符串全部后缀存下来,这里要自己构造出计算哈希表,
2020-07-31 17:15:44
196
原创 KMP算法
#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;const int maxm=1e6+10;char p[maxn];char s[maxm];int net[maxn];int n,m;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; cin>>p+1; cin.
2020-07-31 14:04:39
127
原创 七彩线段
题目链接听说彩虹有七种颜色?一维坐标轴上n条线段,每条线段左端点l,右端点r,颜色为c,从中选m种颜色的互不接触的线段,每种颜色可选多条,所选线段的总长度最长为多少?输入描述:第一行2个整数 n, m;接下来n行,每行3个整数l, r, c。输出描述:一个整数,表示所选线段的最长的总长度;若选不了,输出-1;示例1输入复制4 21 3 14 5 15 8 27 9 3输出复制5示例2输入复制4 31 3 14 5 15 8 27 9 3输出复制-1
2020-07-31 12:56:03
295
原创 牛客编程S1-第七场题解
比赛地址1.牛牛打怪兽题意身为屯里第一剑士的牛牛来到训练场里闯关,由于过于勤奋,牛牛的宝剑的耐久度降到了 22 ,这意味着牛牛最多只能打倒两只怪兽,否则将会被淘汰。训练场的地图可以看作一棵以 11 为根节点的树,训练场的终点为这棵树的叶子结点,树上的每个结点最多有一只怪兽,结点与结点间的边上没有怪兽。每一个有怪兽的结点上牛牛都需要打倒怪兽才算安全,并且牛牛一旦选定好打怪路线之后便不能走回头路。请问牛牛有多少种到达终点且不被淘汰的路径。思路:dfs求解即可,要特判一下n为1的情况;class
2020-07-31 11:21:33
234
原创 寻宝
思路分析:首先如果有M存在的话:最短路径一定是:S-O-M-O-M-…-T当没有M存在的话,即S-T的最短路径,可以BFS来S-T的最短距离当没有M存在的话,考虑最简单的情况,即不需要搬石头的情况,就是状压dp类似最短哈曼顿路径来求经S-T的最短距离,即首先DFS求出每个M到达其他M即起点终点的距离,dp[i][j]表示当前到达的点情况为i处于j点的情况,状压dp求解。再考虑更复杂的需要取石块的情况,即需要加一步(每个石块堆到达每个M点的距离),这样求出后我们可以预处理出两个M点之间的最短距离,这.
2020-07-29 14:32:46
313
原创 生成树
思路:一开始想着去慢慢查找,肯定是超时超空间的,后面发现其实我们只要第二图相对于第一个图哪些变是有的那些边是没有的,这些边的树木便是最少次数,可证明。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int n;map<int,map<int,bool> > vis;int main(){ ios::sync_with_stdio(false); cin.tie(0);..
2020-07-28 22:52:56
180
原创 小A的最短路
思路:LCA求出没有缆车情况下消耗的体力,当有缆车情况下则有如下两种情况(1)出发点到u,u坐缆车到v,v再到终点(2)出发点先v,v坐缆车到u, u再到终点这三种情况取最小即可。#include<bits/stdc++.h>using namespace std;const int maxn=35;int n,m;int Map[maxn][maxn];bool vis[maxn][maxn];int dx[4]={1,-1,0,0};int dy[4]={0,0,1.
2020-07-28 22:40:56
177
原创 85.最大矩阵
思路:有点类似于之前做过的最大正方形面积,维护l[i][j]维护以(i,j)为末尾的横向1的长度,r[i][j]维护i,j结尾的纵向1的长度。class Solution {public: int maximalRectangle(vector<vector<char>>& matrix) { int n=matrix.size(); if(n==0) return 0; int m=matrix[0].size(.
2020-07-28 08:25:33
362
原创 K步可达地方路
题目描述小A来到了一个陌生的城镇,这个城镇与其它城镇之间构成了集群。城镇之间的路径都是单向的,而小A每一天都能由一个城镇走到另外一个城镇。小A将会连续走k天,直到抵达某个城镇。也许他并不能走到这个城镇,那么可以认为不存在这样的路径,也就是路径数为0。否则就会有若干条路径可以抵达某个城镇。现在他想知道,如果他从给定某个城市出发,k天之后到达其它城镇的路径的总和是多少。数据不保证没有重边,也就是说可能每一天从一个城镇到另外一个城镇之间会有多条路径。路径总和可能会非常大,对答案模上1000000007。输入描
2020-07-27 21:29:38
265
原创 牛牛的字符串
思路:一开始想得太复杂,后面看大佬们的思路,其实只需要每次把前面比当前小的的加上,然后更新即可。class Solution {public: int turn(string s, int k) { int n=s.size(); int sum=0; int vis[26]; for(int i=0;i<k&&i<n;i++){ memset(vis,0,sizeof(vis.
2020-07-26 10:08:07
346
原创 329.矩阵中最长的递增路径
思路:1:记忆化搜索:由于路径可以保证前一个节点一定小于后一个节点,故不可能产生重叠情况,故采用记忆化搜索即可。2.拓扑排序,把该图看为有向图,相邻的两个节点中,其较小的顶点有一条边指向较大顶点,故可以采用拓扑排序来做。class Solution {//记忆化搜索public: int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int Dfs(vector<vector<int>>& matrix,ve.
2020-07-26 09:19:09
118
原创 95.不同的二叉搜索树
思路:一开始是暴力回溯,后面看大佬题解发现其实可以分治来做,对于(l,n)区间,取i为根节点,我们可以首先求解(l,i-1)和(i+1,r)子问题,再左右组合得到(l,n)区间的组合。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nul.
2020-07-21 09:45:36
125
原创 平衡二叉树
平衡二叉树,顾名思义就是一棵“平衡”的二叉树。在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情况下树的高度定义为根节点左右子树高度最大值 + 1. 一棵在高度上平衡的树,节点数可能不平衡,因此再定义一棵树的不平衡度为这棵树中所有节点的左右子树的节点数之差的最大值。给定平衡的定义参数d, 你需要求出所有高度为 n 的平衡树中不平衡度的最大值。思路:要想两边差最大,则左侧一定是满二叉树,右侧则是满足条件的最少节点的二叉树
2020-07-20 14:09:33
225
原创 1424.对角线遍历 II
思路:可以发现每条对角线上元素,横坐标加纵坐标的和相等,且和越小的先被遍历,所以我们可以按照x+y去分类,开一个二维数组ans[ i ] [ j ],i表示(x+y),然后正常遍历这个nums,每遍历到一个元素,看看它的x+y,把它丢到ans[x+y]中。由于我们是从左到右从上到下遍历nums的,所以答案是反过来的,最后再reverse一下就行了。class Solution {public: vector<int> findDiagonalOrder(vector<vec.
2020-07-20 12:24:03
239
原创 牛牛采野菜
书接上回,牛妹组织春游,有一个有趣的项目是挖番薯。聪明的牛妹拿到了一个表明了番薯洞的地图,每个番薯洞中有一定数量的番薯。同时,我们知道番薯洞的连接路径,并规定路径是单向且小序号指向大序号,也无环。可以从任意一处开始挖,然后沿着连接往下挖(仅能选择一条路径),当无连接时,结束。设计一种挖番薯的方案,使得可以挖到更多的番薯。输出路径。思路:一开始我是dfs记忆化搜索写了好久好久还改了很久,后面看大佬代码,原来可以直接记录每个点的前缀节点,根据前缀来推该点的最大值,因为该路都是由小节点指向大节点,故可以保
2020-07-20 08:42:07
198
原创 Leetcode 1494并行课程
思路:状压dp,dp[i]表示上i中课程的最小学期,同时需要预处理每个i保存几个1,预处理每个课程的前缀课程。class Solution {public: int minNumberOfSemesters(int n, vector<vector<int>>& dependencies, int k) { vector<int> c((1<<15)+1,0); for(int i=0;i<(1.
2020-07-17 21:57:50
626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人