
获得徽章 0
#青训营笔记创作活动# 问题描述
小M拥有一个长度为n的数组,该数组会每秒发生一次变幻。具体规则是:每次变幻,数组的第1个位置的数字与第2个位置的数字合并,数组的第3个位置的数字与第4个位置的数字合并,依次类推,直到只剩下两个数字为止。合并的规则是将两个数字相加。
小M希望知道数组在每次变幻后,数组的第一个数字会累加到一个初始值为0的变量x中,最后输出变量x的值。由于数据量可能非常大,最后的答案需要对 109+7 取模。
为了简化输入,数组是通过k条信息给出的,信息的形式为两个数组 a 和 b,其中 a[i] 表示数组中有 a[i] 个数字 b[i]。
测试样例
样例1:
输入:n = 5 ,k = 5,a = [1, 1, 1, 1, 1] ,b = [1, 2, 3, 4, 5]
输出:13
样例2:
输入:n = 7 ,k = 2,a = [3, 4] ,b = [1, 2]
输出:7
样例3:
输入:n = 10 ,k = 2,a = [3, 7] ,b = [1, 2]
输出:20
题解:
观察题目,发现展开数组后,所得的答案就变成前2个数字相加+前4个数字相加+前8个数字相加+……+前2n个数字相加。
于是展开数组,初始化sum为前两个数相加(当n<=2的时候直接返回0),初始化last为sum,从长度为4开始,但是我们只遍历其中一半的数据,所以t即为2。每遍历一次,t*=2,直到原数组长度<=t*2 && >t。
在遍历循环中,要记录新加的数为last2,更新last为last+last2,sum在开头要加上last。解释一下就是第一个是前两个数相加,也就是v0+v1,第二个数是(v0+v1)+(v0+v1+v2+v3),而last是v0+v1,last2是v2+v3。这样应该会明白一些。
小M拥有一个长度为n的数组,该数组会每秒发生一次变幻。具体规则是:每次变幻,数组的第1个位置的数字与第2个位置的数字合并,数组的第3个位置的数字与第4个位置的数字合并,依次类推,直到只剩下两个数字为止。合并的规则是将两个数字相加。
小M希望知道数组在每次变幻后,数组的第一个数字会累加到一个初始值为0的变量x中,最后输出变量x的值。由于数据量可能非常大,最后的答案需要对 109+7 取模。
为了简化输入,数组是通过k条信息给出的,信息的形式为两个数组 a 和 b,其中 a[i] 表示数组中有 a[i] 个数字 b[i]。
测试样例
样例1:
输入:n = 5 ,k = 5,a = [1, 1, 1, 1, 1] ,b = [1, 2, 3, 4, 5]
输出:13
样例2:
输入:n = 7 ,k = 2,a = [3, 4] ,b = [1, 2]
输出:7
样例3:
输入:n = 10 ,k = 2,a = [3, 7] ,b = [1, 2]
输出:20
题解:
观察题目,发现展开数组后,所得的答案就变成前2个数字相加+前4个数字相加+前8个数字相加+……+前2n个数字相加。
于是展开数组,初始化sum为前两个数相加(当n<=2的时候直接返回0),初始化last为sum,从长度为4开始,但是我们只遍历其中一半的数据,所以t即为2。每遍历一次,t*=2,直到原数组长度<=t*2 && >t。
在遍历循环中,要记录新加的数为last2,更新last为last+last2,sum在开头要加上last。解释一下就是第一个是前两个数相加,也就是v0+v1,第二个数是(v0+v1)+(v0+v1+v2+v3),而last是v0+v1,last2是v2+v3。这样应该会明白一些。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小M在春游时打算携带尽可能多的巧克力板。她拥有n块巧克力板,每块巧克力的边长为ai,重量为ai2。小M有多个不同大小的背包,每个背包都有一定的最大承重限制。她希望你帮助她计算在每个背包的最大承重范围内,最多可以带走多少块巧克力板。
例如:小M有5块巧克力板,边长分别为1, 2, 2, 4, 5,有5个不同的背包,其最大承重分别为1, 3, 7, 9, 15。对于每个背包,她能装入的巧克力块数分别是1, 1, 2, 3, 3。
测试样例
样例1:
输入:n = 5, m = 5, a = [1, 2, 2, 4, 5], queries = [1, 3, 7, 9, 15]
输出:[1, 1, 2, 3, 3]
样例2:
输入:n = 4, m = 3, a = [3, 1, 2, 5], queries = [5, 10, 20]
输出:[2, 2, 3]
样例3:
输入:n = 6, m = 4, a = [1, 3, 2, 2, 4, 6], queries = [8, 12, 18, 25]
输出:[2, 3, 4, 4]
题解:
将巧克力板按边长从小到大排序,然后计算重量,每选择一个背包就遍历巧克力的重量,减去即可。
小M在春游时打算携带尽可能多的巧克力板。她拥有n块巧克力板,每块巧克力的边长为ai,重量为ai2。小M有多个不同大小的背包,每个背包都有一定的最大承重限制。她希望你帮助她计算在每个背包的最大承重范围内,最多可以带走多少块巧克力板。
例如:小M有5块巧克力板,边长分别为1, 2, 2, 4, 5,有5个不同的背包,其最大承重分别为1, 3, 7, 9, 15。对于每个背包,她能装入的巧克力块数分别是1, 1, 2, 3, 3。
测试样例
样例1:
输入:n = 5, m = 5, a = [1, 2, 2, 4, 5], queries = [1, 3, 7, 9, 15]
输出:[1, 1, 2, 3, 3]
样例2:
输入:n = 4, m = 3, a = [3, 1, 2, 5], queries = [5, 10, 20]
输出:[2, 2, 3]
样例3:
输入:n = 6, m = 4, a = [1, 3, 2, 2, 4, 6], queries = [8, 12, 18, 25]
输出:[2, 3, 4, 4]
题解:
将巧克力板按边长从小到大排序,然后计算重量,每选择一个背包就遍历巧克力的重量,减去即可。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小F的糖果工厂能够生产nn种不同种类的糖果,糖果的编号从1到n。每天,工厂可以生产编号为i的ci个糖果。今天,小F接到了一个特殊的订单,订单要求生产a包糖果,每包糖果都必须是同一种类的,并且每包糖果的数量不能少于b个。你能帮小F计算一下,工厂至少需要多少天才能完成这个订单吗?
测试样例
样例1:
输入:n = 3 ,a = 10 ,b = 20 ,candies = [7, 9, 6]
输出:10
样例2:
输入:n = 4 ,a = 5 ,b = 15 ,candies = [3, 10, 8, 4]
输出:4
样例3:
输入:n = 2 ,a = 100 ,b = 5 ,candies = [1, 10]
输出:46
题解:
直接循环天数,就能得到到第几天,每种糖果总共生产了多少,也能算出有多少包,这个问题就解决了,很简单的问题。
小F的糖果工厂能够生产nn种不同种类的糖果,糖果的编号从1到n。每天,工厂可以生产编号为i的ci个糖果。今天,小F接到了一个特殊的订单,订单要求生产a包糖果,每包糖果都必须是同一种类的,并且每包糖果的数量不能少于b个。你能帮小F计算一下,工厂至少需要多少天才能完成这个订单吗?
测试样例
样例1:
输入:n = 3 ,a = 10 ,b = 20 ,candies = [7, 9, 6]
输出:10
样例2:
输入:n = 4 ,a = 5 ,b = 15 ,candies = [3, 10, 8, 4]
输出:4
样例3:
输入:n = 2 ,a = 100 ,b = 5 ,candies = [1, 10]
输出:46
题解:
直接循环天数,就能得到到第几天,每种糖果总共生产了多少,也能算出有多少包,这个问题就解决了,很简单的问题。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小U拿到了一个由 n 个正整数组成的数组,她需要从中选择一个连续子数组,使得该子数组中所有元素的乘积在二进制表示中末尾至少有 k 个连续的 0。也就是说,子数组的乘积必须是 2k 的倍数。你的任务是找到满足条件的最短连续子数组的长度。如果不存在这样的子数组,输出 −1。
例如,给定数组 [1, 2, 3, 4, 5, 6] 和 k=3,你需要找到一个连续子数组,它的乘积在二进制中尾部至少有3个 0。取子数组 [2, 3, 4] 时,乘积 2×3×4=24,其二进制表示为 11000,尾部有3个 0。
测试样例
样例1:
输入:n = 6,k = 3,a = [1, 2, 3, 4, 5, 6]
输出:3
样例2:
输入:n = 5,k = 2,a = [10, 2, 8, 5, 4]
输出:1
样例3:
输入:n = 4,k = 4,a = [1, 3, 5, 7]
输出:-1
题解:
感觉这都不能算题解,就循环个数从1-n,循环起始点从0-(n-i),再循环子数组求积,最后取模一下看是否匹配,数据集也给的很宽,O(N3)也能过。
可以简单优化一下,使用前缀的思想,但是数组要开long long int的否则会超范围,然后只要O(N2)就可解决这个问题。
小U拿到了一个由 n 个正整数组成的数组,她需要从中选择一个连续子数组,使得该子数组中所有元素的乘积在二进制表示中末尾至少有 k 个连续的 0。也就是说,子数组的乘积必须是 2k 的倍数。你的任务是找到满足条件的最短连续子数组的长度。如果不存在这样的子数组,输出 −1。
例如,给定数组 [1, 2, 3, 4, 5, 6] 和 k=3,你需要找到一个连续子数组,它的乘积在二进制中尾部至少有3个 0。取子数组 [2, 3, 4] 时,乘积 2×3×4=24,其二进制表示为 11000,尾部有3个 0。
测试样例
样例1:
输入:n = 6,k = 3,a = [1, 2, 3, 4, 5, 6]
输出:3
样例2:
输入:n = 5,k = 2,a = [10, 2, 8, 5, 4]
输出:1
样例3:
输入:n = 4,k = 4,a = [1, 3, 5, 7]
输出:-1
题解:
感觉这都不能算题解,就循环个数从1-n,循环起始点从0-(n-i),再循环子数组求积,最后取模一下看是否匹配,数据集也给的很宽,O(N3)也能过。
可以简单优化一下,使用前缀的思想,但是数组要开long long int的否则会超范围,然后只要O(N2)就可解决这个问题。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小Y有一个数字串,她希望通过分隔这个字符串来获得一些子串,每个子串代表一个数字。她的目标是最大化能获得的是 3 的倍数的数字的数量。分隔后的数字串不能包含前导零(但数字 0 本身是允许的),因为 0 也被视为 3 的倍数。
例如,对于数字串 1123,可以将其分割为 [1, 12, 3],其中 12 和 3 是 3 的倍数,因此小Y最多可以获得 2 个是 3 的倍数的数字。
测试样例
样例1:
输入:n = "1123"
输出:2
样例2:
输入:n = "300"
输出:3
样例3:
输入:n = "987654321"
输出:6
题解:
字符串中每一个数字都有两种情况,一个是选,一个是不选,所以使用回溯或者动态规划求解比较简单,这里选择回溯法。
回溯DFS中的i是当前数字,last是上一个数字是否选取,1为选,0为不选,sum是当前选择子串的和,用来判断是否是3的倍数,cnt是3的倍数的子串的个数。
剩下的就是编写退出条件,因为要找所有的子串,所以退出条件就是i>=n.size(),而判断是否为3的倍数,除了检测3的问题,还要考虑上一个数是否选取的问题。
小Y有一个数字串,她希望通过分隔这个字符串来获得一些子串,每个子串代表一个数字。她的目标是最大化能获得的是 3 的倍数的数字的数量。分隔后的数字串不能包含前导零(但数字 0 本身是允许的),因为 0 也被视为 3 的倍数。
例如,对于数字串 1123,可以将其分割为 [1, 12, 3],其中 12 和 3 是 3 的倍数,因此小Y最多可以获得 2 个是 3 的倍数的数字。
测试样例
样例1:
输入:n = "1123"
输出:2
样例2:
输入:n = "300"
输出:3
样例3:
输入:n = "987654321"
输出:6
题解:
字符串中每一个数字都有两种情况,一个是选,一个是不选,所以使用回溯或者动态规划求解比较简单,这里选择回溯法。
回溯DFS中的i是当前数字,last是上一个数字是否选取,1为选,0为不选,sum是当前选择子串的和,用来判断是否是3的倍数,cnt是3的倍数的子串的个数。
剩下的就是编写退出条件,因为要找所有的子串,所以退出条件就是i>=n.size(),而判断是否为3的倍数,除了检测3的问题,还要考虑上一个数是否选取的问题。
展开
评论
1
#青训营笔记创作活动# 问题描述
在一个神奇的二叉树中,结构非常独特:
每层的节点值赋值方向是交替的,第一层从左到右,第二层从右到左,以此类推,且该二叉树有无穷多层。
小R对这个二叉树充满了好奇,她想知道,在二叉树中两个节点之间x, y的路径长度是多少。
graph TD
1((1));2((2));3((3));4((4));
5((5));6((6));7((7));8((8));
9((9));10((10));11((11));
1---3;1---2;3---4;3---5;
2---6;2---7;6---11;6---10;
7---9;7---8;
测试样例
示例 1:
输入:x = 11, y = 4
输出:5
示例 1:
输入:x = 2, y = 5
输出:3
示例 1:
输入:x = 7, y = 7
输出:0
题解:
因为每层的个数都是上一层乘二,同时是个,n为层数。所以就是x,y所在的层数。接着通过层高的奇偶性判断排列的顺序,再与x,y相减便可得到所在的位置。最后一层一层向上找相同的根即可得到路程。
在一个神奇的二叉树中,结构非常独特:
每层的节点值赋值方向是交替的,第一层从左到右,第二层从右到左,以此类推,且该二叉树有无穷多层。
小R对这个二叉树充满了好奇,她想知道,在二叉树中两个节点之间x, y的路径长度是多少。
graph TD
1((1));2((2));3((3));4((4));
5((5));6((6));7((7));8((8));
9((9));10((10));11((11));
1---3;1---2;3---4;3---5;
2---6;2---7;6---11;6---10;
7---9;7---8;
测试样例
示例 1:
输入:x = 11, y = 4
输出:5
示例 1:
输入:x = 2, y = 5
输出:3
示例 1:
输入:x = 7, y = 7
输出:0
题解:
因为每层的个数都是上一层乘二,同时是个,n为层数。所以就是x,y所在的层数。接着通过层高的奇偶性判断排列的顺序,再与x,y相减便可得到所在的位置。最后一层一层向上找相同的根即可得到路程。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小F正在超市购物,有n个商品摆成一排,每个商品的价格为ai,小F对它的喜爱度为bi。所有商品的价格都是偶数。超市有一个活动:当小F以原价购买某件商品时,她可以用半价购买下一件右边相邻的商品(当然也可以选择以原价购买,这样下一件商品仍有机会半价购买)。然而,如果小F半价购买了一件商品,那么下一件相邻的商品只能原价购买。
小F手中有x金额,她希望通过购物活动,尽可能最大化她获得的喜爱度总和,并且购买的商品总价格不能超过她的初始金额x。
测试样例
样例1:
输入:n = 4 ,x = 7 ,a = [2, 2, 6, 2] ,b = [3, 4, 5, 1]
输出:12
样例2:
输入:n = 3 ,x = 10 ,a = [4, 4, 4] ,b = [2, 3, 5]
输出:10
样例3:
输入:n = 5 ,x = 8 ,a = [2, 4, 4, 6, 2] ,b = [1, 2, 3, 4, 5]
输出:10
题解:
使用DFS求解,其中传入DFS的数据的意义分别是
i:当前决定的物品;
t:当前使用的价格;
love:当前的喜爱值;
half:当前商品是否可以半价购买;
一个商品总共有三种状态:原价买,半价买,不买,其中半价有前一个商品原价的要求。
小F正在超市购物,有n个商品摆成一排,每个商品的价格为ai,小F对它的喜爱度为bi。所有商品的价格都是偶数。超市有一个活动:当小F以原价购买某件商品时,她可以用半价购买下一件右边相邻的商品(当然也可以选择以原价购买,这样下一件商品仍有机会半价购买)。然而,如果小F半价购买了一件商品,那么下一件相邻的商品只能原价购买。
小F手中有x金额,她希望通过购物活动,尽可能最大化她获得的喜爱度总和,并且购买的商品总价格不能超过她的初始金额x。
测试样例
样例1:
输入:n = 4 ,x = 7 ,a = [2, 2, 6, 2] ,b = [3, 4, 5, 1]
输出:12
样例2:
输入:n = 3 ,x = 10 ,a = [4, 4, 4] ,b = [2, 3, 5]
输出:10
样例3:
输入:n = 5 ,x = 8 ,a = [2, 4, 4, 6, 2] ,b = [1, 2, 3, 4, 5]
输出:10
题解:
使用DFS求解,其中传入DFS的数据的意义分别是
i:当前决定的物品;
t:当前使用的价格;
love:当前的喜爱值;
half:当前商品是否可以半价购买;
一个商品总共有三种状态:原价买,半价买,不买,其中半价有前一个商品原价的要求。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小Q和小X是很好的朋友,她们正在玩一个游戏。她们拿到了一个数组,游戏开始时小Q随机选择一个元素作为起点。接着,两人轮流行动,小Q先行动。
每次行动时,当前玩家需要选择当前元素左边比它更小的元素,然后移动到该元素,接下来换另一方从这个元素继续移动。如果某一方无法进行合法的移动,则该方输掉游戏。
小Q想知道,在双方都采取最优策略的情况下,她最终获胜的概率是多少?请输出分数的最简形式,即分子和分母互素。如果小Q必胜,则输出 1/1。如果小Q必败,则输出 0/1。
测试样例
样例1:
输入:n = 5,a = [3, 1, 5, 4, 3]
输出:'3/5'
样例2:
输入:n = 6,a = [6, 2, 9, 7, 4, 3]
输出:'2/3'
样例3:
输入:n = 4,a = [8, 5, 6, 3]
输出:'1/4'
题解:
题目给定一个数组,其中小Q和小S都是按最优解的路走的,所以当小Q每一步如果有获胜的可能性,则直接判定为小Q胜。
题目的意思简单来说就是选定一个数,两个人轮流在数的左边任意位置挑选比这个数小的数,直到一个人选不了为止。所以使用一个sum来计数,从小Q开始的话,当sum为奇数时则小Q会获胜。
不能直接使用贪心,因为可能会漏掉情况,所以采用BFS遍历所有情况,在每一次选择好初始的数后,将左边所有小于这个数的全部push进队列。当这些情况中出现了小Q获胜的情况,及判定小Q获胜,ans++。
最后的通分和转字符串就不再赘述。
小Q和小X是很好的朋友,她们正在玩一个游戏。她们拿到了一个数组,游戏开始时小Q随机选择一个元素作为起点。接着,两人轮流行动,小Q先行动。
每次行动时,当前玩家需要选择当前元素左边比它更小的元素,然后移动到该元素,接下来换另一方从这个元素继续移动。如果某一方无法进行合法的移动,则该方输掉游戏。
小Q想知道,在双方都采取最优策略的情况下,她最终获胜的概率是多少?请输出分数的最简形式,即分子和分母互素。如果小Q必胜,则输出 1/1。如果小Q必败,则输出 0/1。
测试样例
样例1:
输入:n = 5,a = [3, 1, 5, 4, 3]
输出:'3/5'
样例2:
输入:n = 6,a = [6, 2, 9, 7, 4, 3]
输出:'2/3'
样例3:
输入:n = 4,a = [8, 5, 6, 3]
输出:'1/4'
题解:
题目给定一个数组,其中小Q和小S都是按最优解的路走的,所以当小Q每一步如果有获胜的可能性,则直接判定为小Q胜。
题目的意思简单来说就是选定一个数,两个人轮流在数的左边任意位置挑选比这个数小的数,直到一个人选不了为止。所以使用一个sum来计数,从小Q开始的话,当sum为奇数时则小Q会获胜。
不能直接使用贪心,因为可能会漏掉情况,所以采用BFS遍历所有情况,在每一次选择好初始的数后,将左边所有小于这个数的全部push进队列。当这些情况中出现了小Q获胜的情况,及判定小Q获胜,ans++。
最后的通分和转字符串就不再赘述。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小R拿到了一个数组,她可以进行如下操作:使得一个元素加1,另一个元素减1。她希望最终数组的每个元素大小都在[l, r]的范围内。小R想知道,最少需要多少次操作可以达到目标。
如果无法通过有限次操作使所有元素都落在指定范围内,则返回-1。
测试样例
样例1:
输入:n = 2 ,l = 3 ,r = 5 ,a = [1, 2]
输出:-1
样例2:
输入:n = 3 ,l = 4 ,r = 6 ,a = [3, 6, 5]
输出:1
样例3:
输入:n = 4 ,l = 2 ,r = 8 ,a = [1, 10, 2, 6]
输出:2
题解:
首先,整个数组的总和是不变的,所以数组的总和的下限和上限时相同的,于是第一步就是考虑这个数组是否可以塞进这个区间里。
不用考虑怎么变,只考虑是否能变。所以将所有低于l的元素和高于r的元素之间的差值取出,叫做lowsize和upsize,而其中的较大值就是最后的操作次数。因为其中高的可以补充低的,低的可以削减高的。
小R拿到了一个数组,她可以进行如下操作:使得一个元素加1,另一个元素减1。她希望最终数组的每个元素大小都在[l, r]的范围内。小R想知道,最少需要多少次操作可以达到目标。
如果无法通过有限次操作使所有元素都落在指定范围内,则返回-1。
测试样例
样例1:
输入:n = 2 ,l = 3 ,r = 5 ,a = [1, 2]
输出:-1
样例2:
输入:n = 3 ,l = 4 ,r = 6 ,a = [3, 6, 5]
输出:1
样例3:
输入:n = 4 ,l = 2 ,r = 8 ,a = [1, 10, 2, 6]
输出:2
题解:
首先,整个数组的总和是不变的,所以数组的总和的下限和上限时相同的,于是第一步就是考虑这个数组是否可以塞进这个区间里。
不用考虑怎么变,只考虑是否能变。所以将所有低于l的元素和高于r的元素之间的差值取出,叫做lowsize和upsize,而其中的较大值就是最后的操作次数。因为其中高的可以补充低的,低的可以削减高的。
展开
2
点赞
#青训营笔记创作活动# 问题描述
小S在一个nxm的网格迷宫中,初始位置在左上角(1,1),目标是到达右下角(n,m)。每个格子可以是黑色(表示为1)或者白色(表示为0)。他希望在移动过程中经过的黑色格子尽可能少。移
动时可以向上、下、左、右四个方向移动,但不能走出迷宫的边界。请你帮小S计算从起点到终点所需经过的最少黑色格子的数量。
测试样例
样例1:
输入:n=5,m=3,grid=[[0,1,0],[0,1,1],[0,1,0],[1,0,0],[1,0,0]]
输出:1
样例2:
输入:n=4,m=4 ,grid=[[0,0,1,0],[1,0,1,0],[1,0,0,0],[1,1,1,0]]
输出:0
样例3:
输入:n=3,m=3 ,grid= [[0,0,0], [1, 1,0],[1,1,0]]
输出:0
题解:
首先是走迷宫的问题,因为是找一条最少黑格子的线路,所以应该使用DFS,但是因为怕时间可能不通过,就使用了BFS+优先队列的组合,同时辅以visited数组记录是否走过。
其次是黑格子的数量问题,题目要求数量最少,那就使用优先队列,排列条件是走过黑格子数量最少的方法优先。
最后是一些注意的事项,比如当(0,0)就是黑格子要对第一个压入队列的元素初始化。
小S在一个nxm的网格迷宫中,初始位置在左上角(1,1),目标是到达右下角(n,m)。每个格子可以是黑色(表示为1)或者白色(表示为0)。他希望在移动过程中经过的黑色格子尽可能少。移
动时可以向上、下、左、右四个方向移动,但不能走出迷宫的边界。请你帮小S计算从起点到终点所需经过的最少黑色格子的数量。
测试样例
样例1:
输入:n=5,m=3,grid=[[0,1,0],[0,1,1],[0,1,0],[1,0,0],[1,0,0]]
输出:1
样例2:
输入:n=4,m=4 ,grid=[[0,0,1,0],[1,0,1,0],[1,0,0,0],[1,1,1,0]]
输出:0
样例3:
输入:n=3,m=3 ,grid= [[0,0,0], [1, 1,0],[1,1,0]]
输出:0
题解:
首先是走迷宫的问题,因为是找一条最少黑格子的线路,所以应该使用DFS,但是因为怕时间可能不通过,就使用了BFS+优先队列的组合,同时辅以visited数组记录是否走过。
其次是黑格子的数量问题,题目要求数量最少,那就使用优先队列,排列条件是走过黑格子数量最少的方法优先。
最后是一些注意的事项,比如当(0,0)就是黑格子要对第一个压入队列的元素初始化。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄
会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
测试样例
样例1:
输入:n=5,u=[1,2,3,1,2]输出:3
样例2:
输入:n=4,u=[100000,100000,100000,100000]输出:0
样例3:
输入:n=6,u=[1,1,1,2,2,2]输出:3
题解:
就是简单的排序,不知道为什么算难题。
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄
会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
测试样例
样例1:
输入:n=5,u=[1,2,3,1,2]输出:3
样例2:
输入:n=4,u=[100000,100000,100000,100000]输出:0
样例3:
输入:n=6,u=[1,1,1,2,2,2]输出:3
题解:
就是简单的排序,不知道为什么算难题。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
给定两个长度为$n$的数组$a$和$b$,这两个数组满足从$1$到$n$的每个整数恰好出现了一次。机器每次可以存储任意长度的连续子数组。你需要计算出机器存储完所有连续子数组后,总共
存储了多少次。
测试样例
样例1:
输入:n=3,a=[1,2,3],b=[2,3,1]输出:8
样例2:
输入:n=4,a=[1,4,3,2],b=[4,1,2,3]输出:16
样例3:
输入:n=5,a=[5,1,4,3,2],b=[3,5,2,1,4]输出:24
题解:
题目有些难懂,说白了就是求两个字符串所有不相同的子串。所以直接全部遍历一遍所有子串,经过set查重后,最后的sum即是子串的数量。
给定两个长度为$n$的数组$a$和$b$,这两个数组满足从$1$到$n$的每个整数恰好出现了一次。机器每次可以存储任意长度的连续子数组。你需要计算出机器存储完所有连续子数组后,总共
存储了多少次。
测试样例
样例1:
输入:n=3,a=[1,2,3],b=[2,3,1]输出:8
样例2:
输入:n=4,a=[1,4,3,2],b=[4,1,2,3]输出:16
样例3:
输入:n=5,a=[5,1,4,3,2],b=[3,5,2,1,4]输出:24
题解:
题目有些难懂,说白了就是求两个字符串所有不相同的子串。所以直接全部遍历一遍所有子串,经过set查重后,最后的sum即是子串的数量。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小F正在使用一个骑士跳跃方式的拨号器。这个拨号器是一个类似电话键盘的3x4矩阵,每个数字对应一个单元格,骑士只能站在蓝色数字单元格上进行跳跃(数字1到9和0)。骑士的移动方式
和国际象棋中的马相同:它可以垂直移动两个单元格并水平移动一个单元格,或水平移动两个单元格并垂直移动一个单元格,形成“L“形。
123
456
789
*0#
给定一个整数n,你需要帮助小F计算骑士可以拨出的所有长度为n的不同电话号码的数量。骑士可以从任何数字开始,并在n-1次有效跳跃后得到一个有效号码。答案可能非常大,因此你需要返
回对10^9+7取模的结果。
测试样例
样例1:
输入:n=1输出:10
样例2:
输入:n=2输出:20
样例3:
输入:n=3输出:46
题解:
开始看到表盘以为是跳棋类的问题,但是看到后面数据较大的提示,那就使用动态规划了。于是就得到了DP[i][j]的定义:
从i开始的拨号,经过j次得到的号码数量
状态转移方程不好直接写出来:
DP[i][j]=DP[i-1][x1]+DP[i-1][x2]+...+DP[i-1][xn]
其中x1,x2...xn是能到达j的其他数字。
小F正在使用一个骑士跳跃方式的拨号器。这个拨号器是一个类似电话键盘的3x4矩阵,每个数字对应一个单元格,骑士只能站在蓝色数字单元格上进行跳跃(数字1到9和0)。骑士的移动方式
和国际象棋中的马相同:它可以垂直移动两个单元格并水平移动一个单元格,或水平移动两个单元格并垂直移动一个单元格,形成“L“形。
123
456
789
*0#
给定一个整数n,你需要帮助小F计算骑士可以拨出的所有长度为n的不同电话号码的数量。骑士可以从任何数字开始,并在n-1次有效跳跃后得到一个有效号码。答案可能非常大,因此你需要返
回对10^9+7取模的结果。
测试样例
样例1:
输入:n=1输出:10
样例2:
输入:n=2输出:20
样例3:
输入:n=3输出:46
题解:
开始看到表盘以为是跳棋类的问题,但是看到后面数据较大的提示,那就使用动态规划了。于是就得到了DP[i][j]的定义:
从i开始的拨号,经过j次得到的号码数量
状态转移方程不好直接写出来:
DP[i][j]=DP[i-1][x1]+DP[i-1][x2]+...+DP[i-1][xn]
其中x1,x2...xn是能到达j的其他数字。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
在一座高度为H的山上,每个高度i处生成了a_i个雪球。当雪球从海拔高度i滚到地面时,它的体积会膨胀x^i倍。也就是说,雪球的初始体积为1,滚动距离i会使体积变成1 * x^i。我们需要计算所有滚落到地面的雪球的总体积,并对结果取模10^9 + 7。
你的任务是帮助计算所有雪球滚落到地面的总体积。
测试样例
样例1:
输入:H = 4, x = 5, a = [1, 3, 2, 4]
输出:2830
样例2:
输入:H = 2, x = 5, a = [1, 2]
输出:55
样例3:
输入:H = 3, x = 3, a = [2, 1, 1]
输出:42
题解:
非常简单,直接算。
在一座高度为H的山上,每个高度i处生成了a_i个雪球。当雪球从海拔高度i滚到地面时,它的体积会膨胀x^i倍。也就是说,雪球的初始体积为1,滚动距离i会使体积变成1 * x^i。我们需要计算所有滚落到地面的雪球的总体积,并对结果取模10^9 + 7。
你的任务是帮助计算所有雪球滚落到地面的总体积。
测试样例
样例1:
输入:H = 4, x = 5, a = [1, 3, 2, 4]
输出:2830
样例2:
输入:H = 2, x = 5, a = [1, 2]
输出:55
样例3:
输入:H = 3, x = 3, a = [2, 1, 1]
输出:42
题解:
非常简单,直接算。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小C遇到了 nn 个怪物,第 ii 个怪物的战斗力为 aiai,而小C的初始战斗力为 00。他需要依次与这些怪物战斗。战斗时的规则如下:
如果小C的战斗力 xx 小于怪物的战斗力 aiai,小C会触发被动技能 "小C不怕困难",将自己的战斗力提升至 aiai,并战胜这个怪物,同时小C的勇气值增加 ai−xai−x。
如果小C的战斗力 xx 大于或等于怪物的战斗力 aiai,他会直接战胜这个怪物,战斗结束后,小C的战斗力会降低至 aiai。
小C可以自由决定与怪物战斗的顺序。他想知道,在打败所有怪物后,自己能够累计提升的勇气值最大是多少。
测试样例
样例1:
输入:n = 2 ,a = [1, 2]
输出:2
样例2:
输入:n = 3 ,a = [1, 2, 2]
输出:3
样例3:
输入:n = 4 ,a = [3, 6, 2, 8]
输出:12
题解:
看到提升勇气值最大,开始觉得应该用动态规划,但是深入一想,要想使勇气值最大,就要实现自己的力量尽量小,打的怪物力量尽量大,并且通过力量最小的怪物刷新自己的力量值就能使力量差值尽量大,算是贪心的算法,但是我没证明其正确性就直接使用了,幸运的是AC了。
小C遇到了 nn 个怪物,第 ii 个怪物的战斗力为 aiai,而小C的初始战斗力为 00。他需要依次与这些怪物战斗。战斗时的规则如下:
如果小C的战斗力 xx 小于怪物的战斗力 aiai,小C会触发被动技能 "小C不怕困难",将自己的战斗力提升至 aiai,并战胜这个怪物,同时小C的勇气值增加 ai−xai−x。
如果小C的战斗力 xx 大于或等于怪物的战斗力 aiai,他会直接战胜这个怪物,战斗结束后,小C的战斗力会降低至 aiai。
小C可以自由决定与怪物战斗的顺序。他想知道,在打败所有怪物后,自己能够累计提升的勇气值最大是多少。
测试样例
样例1:
输入:n = 2 ,a = [1, 2]
输出:2
样例2:
输入:n = 3 ,a = [1, 2, 2]
输出:3
样例3:
输入:n = 4 ,a = [3, 6, 2, 8]
输出:12
题解:
看到提升勇气值最大,开始觉得应该用动态规划,但是深入一想,要想使勇气值最大,就要实现自己的力量尽量小,打的怪物力量尽量大,并且通过力量最小的怪物刷新自己的力量值就能使力量差值尽量大,算是贪心的算法,但是我没证明其正确性就直接使用了,幸运的是AC了。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小F被神秘力量带入了一个魔幻世界,这里危机四伏。为了在异世界中生存,小F需要找到安全区。异世界可以被表示为一个大小为n x m的二维数组,每个格子的值代表该位置的危险程度。
小F的能力值为X,当某个格子的危险程度小于等于X时,这个格子是安全的。如果多个安全的格子相邻(上下左右连通),它们可以构成一个安全区。你需要帮助小F计算出一共有多少个安全区。
测试样例
样例1:
输入:n = 3, m = 3, X = 4, a = [[2, 3, 3], [3, 3, 3], [3, 3, 3]]
输出:1
样例2:
输入:n = 2, m = 2, X = 5, a = [[6, 6], [6, 4]]
输出:1
样例3:
输入:n = 3, m = 3, X = 3, a = [[1, 2, 2], [2, 3, 3], [3, 4, 5]]
输出:1
题解:
一个原二维数组,新建一个visited数组记录是否经过,直接全部遍历,遇到安全值小于能力值且没经过的点就进入while循环。while循环通过队列实现安全区域的搜寻,通过maxnum记录安全区域的个数。
小F被神秘力量带入了一个魔幻世界,这里危机四伏。为了在异世界中生存,小F需要找到安全区。异世界可以被表示为一个大小为n x m的二维数组,每个格子的值代表该位置的危险程度。
小F的能力值为X,当某个格子的危险程度小于等于X时,这个格子是安全的。如果多个安全的格子相邻(上下左右连通),它们可以构成一个安全区。你需要帮助小F计算出一共有多少个安全区。
测试样例
样例1:
输入:n = 3, m = 3, X = 4, a = [[2, 3, 3], [3, 3, 3], [3, 3, 3]]
输出:1
样例2:
输入:n = 2, m = 2, X = 5, a = [[6, 6], [6, 4]]
输出:1
样例3:
输入:n = 3, m = 3, X = 3, a = [[1, 2, 2], [2, 3, 3], [3, 4, 5]]
输出:1
题解:
一个原二维数组,新建一个visited数组记录是否经过,直接全部遍历,遇到安全值小于能力值且没经过的点就进入while循环。while循环通过队列实现安全区域的搜寻,通过maxnum记录安全区域的个数。
展开
4
3
#青训营笔记创作活动# 问题描述
小M有n个点,每个点的坐标为(xi,yi)(xi,yi)。她可以从一个点出发,平行于坐标轴移动,直到到达另一个点。具体来说,她可以从 (x1,y1)(x1,y1) 直接到达 (x2,y1)(x2,y1) 或者 (x1,y2)(x1,y2),但无法直接到达 (x2,y2)(x2,y2)。为了使得任意两个点之间可以互相到达,小M可以选择增加若干个新的点。
你的任务是计算最少需要增加多少个点,才能保证任意两个点之间可以通过平行于坐标轴的路径互相到达。
测试样例
样例1:
输入:n = 2, points = [[1, 1], [2, 2]]
输出:1
样例2:
输入:n = 3, points = [[1, 2], [2, 3], [4, 1]]
输出:2
样例3:
输入:n = 4, points = [[3, 4], [5, 6], [3, 6], [5, 4]]
输出:0
题解:
将原点集中可以经过n步走到集合中另一个点的点的集合分组,给予一个递增的序号,当所有点都被分配了集合序号,也就是将点集分成了诺干个连通的集合,而需要增加的点也就是集合的序号-1(序号从1开始)。
小M有n个点,每个点的坐标为(xi,yi)(xi,yi)。她可以从一个点出发,平行于坐标轴移动,直到到达另一个点。具体来说,她可以从 (x1,y1)(x1,y1) 直接到达 (x2,y1)(x2,y1) 或者 (x1,y2)(x1,y2),但无法直接到达 (x2,y2)(x2,y2)。为了使得任意两个点之间可以互相到达,小M可以选择增加若干个新的点。
你的任务是计算最少需要增加多少个点,才能保证任意两个点之间可以通过平行于坐标轴的路径互相到达。
测试样例
样例1:
输入:n = 2, points = [[1, 1], [2, 2]]
输出:1
样例2:
输入:n = 3, points = [[1, 2], [2, 3], [4, 1]]
输出:2
样例3:
输入:n = 4, points = [[3, 4], [5, 6], [3, 6], [5, 4]]
输出:0
题解:
将原点集中可以经过n步走到集合中另一个点的点的集合分组,给予一个递增的序号,当所有点都被分配了集合序号,也就是将点集分成了诺干个连通的集合,而需要增加的点也就是集合的序号-1(序号从1开始)。
展开
评论
点赞
#青训营笔记创作活动# 问题描述
小C拿到了一个由数字字符和 ? 组成的字符串,她的目标是将所有的 ? 替换成数字字符,使得替换后的字符串表示的十进制整数成为正整数 pp 的倍数。由于方案数可能非常大,需要对最终的结果取模 109+7109+7。
测试样例
样例1:
输入:s = "??",p = 1
输出:100
样例2:
输入:s = "????1",p = 12
输出:0
样例3:
输入:s = "1??2",p = 3
输出:34
题解:
首先想到使用蛮力法硬解,虽然可能会超时,但是先尝试一下,将每个?字符都用0-9替换一遍,然后就果不其然地超时了。
然后想到找出字符串代表数字的最大值与最小值,在其中遍历p的倍数,尝试找出匹配的项,也是蛮力求解。
最后在经过一天的思考后选择了动态规划(确实挺难想的,大概)。定义 dp[i][r] 表示前 i 个字符组成的字符串,其对 p 取模的结果为 r 的方案数。
初始状态:dp[0][0] = 1,空字符串对 p 取模为 0 的方案数为 1。
状态转移方程:
1.当s[i]为数字:
假设当前字符是 digit,则新的模数 new_r 可以通过以下公式计算:
new_r = (r * 10 + digit) % p
更新 dp[i + 1][new_r]:
dp[i + 1][new_r] = (dp[i + 1][new_r] + dp[i][r]) % MOD
2.当s[i]为问号,则从0-9遍历再进行1步骤。
小C拿到了一个由数字字符和 ? 组成的字符串,她的目标是将所有的 ? 替换成数字字符,使得替换后的字符串表示的十进制整数成为正整数 pp 的倍数。由于方案数可能非常大,需要对最终的结果取模 109+7109+7。
测试样例
样例1:
输入:s = "??",p = 1
输出:100
样例2:
输入:s = "????1",p = 12
输出:0
样例3:
输入:s = "1??2",p = 3
输出:34
题解:
首先想到使用蛮力法硬解,虽然可能会超时,但是先尝试一下,将每个?字符都用0-9替换一遍,然后就果不其然地超时了。
然后想到找出字符串代表数字的最大值与最小值,在其中遍历p的倍数,尝试找出匹配的项,也是蛮力求解。
最后在经过一天的思考后选择了动态规划(确实挺难想的,大概)。定义 dp[i][r] 表示前 i 个字符组成的字符串,其对 p 取模的结果为 r 的方案数。
初始状态:dp[0][0] = 1,空字符串对 p 取模为 0 的方案数为 1。
状态转移方程:
1.当s[i]为数字:
假设当前字符是 digit,则新的模数 new_r 可以通过以下公式计算:
new_r = (r * 10 + digit) % p
更新 dp[i + 1][new_r]:
dp[i + 1][new_r] = (dp[i + 1][new_r] + dp[i][r]) % MOD
2.当s[i]为问号,则从0-9遍历再进行1步骤。
展开
评论
点赞