获得徽章 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块巧克力板,每块巧克力的边长为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
题解:
直接循环天数,就能得到到第几天,每种糖果总共生产了多少,也能算出有多少包,这个问题就解决了,很简单的问题。展开评论点赞 - #青训营笔记创作活动# 问题描述
小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的问题,还要考虑上一个数是否选取的问题。展开赞过评论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相减便可得到所在的位置。最后一层一层向上找相同的根即可得到路程。展开评论点赞 - #青训营笔记创作活动# 问题描述
小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++。
最后的通分和转字符串就不再赘述。展开评论点赞 - #青训营笔记创作活动# 问题描述
小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)就是黑格子要对第一个压入队列的元素初始化。展开评论点赞