26.2.5练习总结

今天进行了一次测试,以下是对本次比赛的总结:

T1

题目:

有 n 棵树排在一条直线上,第 i 棵树的位置是一个整数 ai​(两两不同)。

你想让这些树从左到右看起来"间距完全一样",但不能移动已有的树

你可以在任意位置再种一些新树(位置也必须是整数),使得把所有树的位置从小到大排序后,相邻两棵树的距离都相等。

请你输出最少还需要种多少棵树。

思路:

因为不能移动已有的树,所以就只能往里插入树,要使相邻两棵树的距离都相等,就要找所有树距离的公约数,如果不是的话就无法做到。要使树最少,就要找最大公约数,使用GCD后,sum+=树之间的距离/约数-1即可。

T2

题目:

食人国国王只吃人。现在他抓了 n 个人,按从左到右排成一排,编号依次为 1,2,...,n。

国王特别喜欢数字 k(保证 kge2)。他会反复进行如下"报数并吃人"的过程:

  • 当前还活着的人保持原来的相对顺序,从左到右依次报数 1,2,3,...;
  • 在这一轮中,报出的数字不是 k 的倍数的人会按顺序被吃掉;
  • 这一轮结束后,剩下的人再次从 1 开始报数,进入下一轮。

可以证明:不管 n 和 k 取何值(满足 k≥2),国王最终都能把所有人吃掉。

你也是这 n 个人之一。你想知道:最后一个被吃掉的人,最初的编号是多少?

思路:

最开始时,报出的数字不是 k 的倍数的人会按顺序被吃掉,剩下的人报出的数字都是 k 的倍数,然后再进行合并,这时原数字为k的就变成1,2k就变成2......以此类推,也就是全体数字/k,这时是k的倍数的人就是原先是k*k的倍数的人......可以发现最后被吃掉的就是<=n的k的最大次幂的<=n的最大倍数,也就是:

T3

题目:

有一个 n×m 的方格迷宫。第 i 行第 j 列格子里有一个整数 ai,j​,表示你进入该格子会受到的伤害。

你从左上角 (1,1) 出发,要走到右下角 (n,m)。每一步只能向右向下 移动。

一条路径的总伤害定义为:路径上经过的所有格子的伤害之和(包含起点与终点)。

由于不同路径的总伤害可能非常多,你只需要关心总伤害对 10007 取模后的结果。请你计算:所有路径的"总伤害 mod 10007"可能取到多少种不同的值

思路:

如果只求伤害最少的路径,那就是dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j]。但这里要把所有值都统计出来,只需将每个格子的所有值统计下来,求新格子时就将前面几个格子的值都加上当前格子的伤害后合起来即可。(这里直接转移即可,虽然我写了vector)

T4

题目:

数字接龙:如果一列数字从左到右排成一行,并且对每一对相邻数字都满足:

  • 前一个数字的个位 = 后一个数字的最高位

那么我们称这列数字为一个"接龙序列"。

现在给你一个长度为 n 的序列 a1​,a2​,...,an​。你可以删除其中一些数字(可以一个也不删),剩下的数字保持原有相对顺序。

请你计算:最少需要删除多少个数字,才能让剩下的数字恰好形成一个接龙序列。

思路:

因为只需要用到前面数字的个位,而且和前面具体选择的数字没关系,所以就可以开一个dp数组存储,dp[i]表示以i结尾获得的最大序列,到a[j]时就将a[j]的最高位与前面的dp[a[j]的最高位]连起来,在看新序列的长度是否大于dp[a[i]个位]而更新dp[a[i]个位]。(虽然我还不是这样做的,用了个更复杂的方法)

T5

题目:

你正在玩一个关卡游戏。现在你遇到了一个大 Boss,并开始与它战斗。

战斗持续 n 秒。第 i 秒你有两种选择:

  • 普攻:造成 k 点伤害;
  • 使用技能:造成 ai 点伤害。

需要注意:

  • 如果第 i−1 秒你使用了技能,那么第 i 秒再次使用技能时伤害会翻倍,造成 2×ai。
  • 你不能连续使用技能超过两次。也就是说,不能出现连续三秒都使用技能的情况。

请你计算:在 n 秒内最多可以造成多少伤害。

思路:

其实这个很像2月4号的T3。当时是不能偷相邻人家的金币,现在是不能连续使用技能超过两次。不过他们的根本都是一样的,这道题要分三种情况:普攻,从i-1的三种情况找最大+普攻伤害;一次技能,从i-1的普攻+技能伤害;二次技能,从i-1的一次技能+2*技能伤害。最后从dp[n]的三种情况找最大即可。

T6

题目:

公司正在组织聚餐,但每个人都不想和自己的直接上司 同桌吃饭。

作为 HR,你知道每个人的直接上司是谁(只有老板没有上司)。

假设 1 号是老板。现在你想邀请尽可能多的人参加聚餐,但需要满足:

  • 如果某人的直接上司也参加,则该人不能参加(反之亦然)。

请你输出最多能邀请多少人。

思路:

依旧dp。首先建立一个树,然后用dfs。若dfs到x,直接下属为i,先把x的直接下属都dfs完,在分两种情况:选x,就只能将所有i的不选自己的最大值加起来,再加1,不选,就可以从所有i的选或不选自己的最大值加起来。最后找dp[1]的两种情况的最大值即可。

如果大家有其他想法的,可以补充。

相关推荐
tangchao340勤奋的老年?2 小时前
ADS通信 C++ 设置通知方式读取指定变量
开发语言·c++·算法
We་ct2 小时前
LeetCode 1. 两数之和:两种高效解法(双指针 + Map)
前端·算法·leetcode·typescript·哈希算法
无风听海2 小时前
.NET 10之可空引用类型
数据结构·.net
aini_lovee2 小时前
基于MATLAB的材料晶粒组织生长与变化模拟:方法、实现与应用
开发语言·算法·matlab
t198751282 小时前
基于MATLAB的Copula对数似然值计算与参数验证
人工智能·算法·matlab
潇冉沐晴2 小时前
div2 1064补题笔记(A~E)
笔记·算法
YuTaoShao2 小时前
【LeetCode 每日一题】3640. 三段式数组 II——(解法二)DP
算法·leetcode·职场和发展
我爱工作&工作love我2 小时前
P4913 【深基16.例3】二叉树深度 dfs-二叉树的遍历
算法·深度优先·图论
月挽清风2 小时前
代码随想录第十四天
数据结构