程序员基德 level
获赞
202
粉丝
238
关注
3
看过 TA
1188
中国科学技术大学
2026
C++
IP属地:浙江
热爱算法的程序员
私信
关注
------------------------------------题目一:题目大意:有 n (1 <= n <= 10000) 名学生报名三个社团 A、B、C,每个社团有固定的人数上限。系统按学生提交报名表的时间顺序处理,并根据学生的志愿优先级(1-3个志愿)进行分配。如果第一志愿已满,则尝试第二志愿,以此类推。你需要统计最终每个社团的成员名单。解法思路:这是一道直接的模拟题,核心是遵循“先到先得”和“志愿优先”的规则。维护三个社团的剩余名额。按顺序读入每个学生的信息,然后遍历该学生的志愿列表。对于每个志愿,检查对应社团是否还有名额。如果有,则将该学生分配到该社团,减少一个名额,并立即停止处理该学生的后续志愿,转而处理下一个学生。如果所有志愿都尝试过但都已满员,则该学生无法加入任何社团。------------------------------------题目二:题目大意:有 n (1 <= n <= 3000) 个音乐团体,每个团体有 m (1 <= m <= 100) 名成员,每位成员都有一个演出水平评分。你需要从每个团体中各选一名成员,组成一个 n 人的超级乐队。目标是让这个乐队中水平最高与最低的成员差距最小。请求出这个最小的可能差距。解法思路:这个问题可以巧妙地转化为一个滑动窗口问题。首先,将所有 n*m 个成员的信息(评分、所属团体编号)存入一个列表,并按评分从低到高进行排序。然后,问题就变成了在这个排好序的列表中,寻找一个最短的区间,这个区间内包含了来自所有 n 个不同团体的成员。这可以用经典的双指针(滑动窗口)技巧来解决:用一个指针(right)向右扩展窗口,直到窗口内集齐了所有团体的成员;然后,移动左指针(left)来收缩窗口,直到不再满足条件。在每次收缩前,都计算当前窗口的差距(members[right].score - members[left].score)并更新全局最小值。------------------------------------题目三:题目大意:在一个 n x m (1 <= n, m <= 50) 的迷宫中,有 k (1 <= k <= 5) 件古董和一个起点 'S'。迷宫中还有墙'#'和路'.'。移动会消耗时间。一个特殊的规则是:当你已经收集了 a 件古董后,每移动一步,所有未被收集的古董都会损失 a 点价值(价值最低降至1)。你需要规划一个收集所有 k 件古董的顺序,使得最终得到的总价值最高。解法思路:此题的核心突破口在于 k 的值非常小 (k <= 5)。这意味着所有可能的收集顺序数量 k! (最多 5! = 120) 是完全可以接受枚举的。因此,解法分为两步:首先,通过广度优先搜索(BFS)预计算出所有关键点(起点和 k 个古董位置)之间的两两最短路径长度。然后,枚举所有 k! 种排列组合作为收集顺序。对于每一种顺序,模拟整个过程:从起点出发,按顺序访问古董,在每次移动时,根据已收集的古董数量和移动的步数,更新所有尚未收集的古董的价值,并累加最终收集到的价值。最后在所有顺序中取最大值。------------------------------------题目四:题目大意:在一个长度为 n (1 <= n <= 100) 的一维地面上,有 m (1 <= m <= 1000) 个彩球从不同高度、不同时间开始下落。你需要控制一个筐来接球。每秒可以向左或向右移动一格,或不动。接到普通球得分,但接到陷阱球(积分为0)会被“冰冻”在原地3秒。在冰冻期间仍可接球,但无法移动。如果冰冻期内又接到陷阱球,冰冻时间重置为3秒。目标是获得最高总积分。解法思路:这是一个在时间和空间上进行的动态规划问题。首先,可以确定每个球的落地时间(=初始高度y + 开始下落时间t)。DP的状态可以设计为 `dp[time][pos][freeze]`,表示在 `time` 时刻,位于 `pos` 位置,且冰冻状态为 `freeze`(剩余冰冻秒数)时能获得的最大积分。状态转移则按时间顺序进行:`dp[t+1][...][...]` 的值由 `dp[t][...][...]` 转移而来。如果当前状态不是冰冻的(`freeze == 0`),则可以从 `pos-1`, `pos`, `pos+1` 三个位置转移过来;如果是冰冻的(`freeze > 0`),则只能从 `pos` 位置转移过来。在每个新位置,检查该时刻是否有球落下,加上其积分,并根据是否为陷阱球更新新的冰冻状态。
投递网易等公司10个岗位
0 点赞 评论 收藏
分享
------------------------------------题目一:题目大意:有 n (1 <= n <= 50000) 名研究生和 m (1 <= m <= 100000) 套资料。每名研究生需要一个连续编号的资料区间 [Li, Ri]。你需要将所有资料分到两个阅览室,使得尽可能多的研究生获得认证。认证条件是:某研究生需要的资料区间 [Li, Ri] 能完全覆盖其中一个阅览室的所有资料。解法思路:关键在于简化问题。最优的分配方案之一,必然是让其中一个阅览室只存放一套资料,例如只放资料 p。在这种情况下,研究生只要其需求区间 [L, R] 包含了资料 p,就可以获得认证。因此,问题转化为:找到哪个资料编号被最多的区间所覆盖。这是一个经典的区间覆盖问题,可以使用差分数组解决。遍历所有研究生的需求区间 [L, R],在差分数组上执行 diff[L]++ 和 diff[R+1]--。最后,计算差分数组的前缀和,其过程中的最大值就是答案。------------------------------------题目二:题目大意:在一个 n x m (1 <= n, m <= 8) 的方形区域中,有一些位置被标记为“*”。你可以用 1x3 或 3x1 的石柱覆盖区域,但每个石柱的至少一端必须在“*”上,且石柱不能重叠。当无法再放置任何石柱时,形成一个最终布局。问总共可能有多少种不同的最终布局状态(只关心哪些格子被覆盖)。(标记位置不超过13个)解法思路:由于标记点数量和网格大小都非常有限,这道题可以通过状态搜索来解决。核心是为每个“*”标记点决策如何放置石柱(或不放置)。我们可以用深度优先搜索(DFS)来枚举所有可能的放置组合。为了高效地表示和检查网格的占用状态,可以使用位运算(bitmask),一个64位的整数即可表示整个8x8的网格。DFS的每一层对应一个标记点,尝试以该点为端点向四个方向放置石柱,如果放置不越界且不与当前已占用的格子重叠,就更新mask并递归到下一个标记点。所有搜索完成后,将最终的mask存入一个集合(Set)中,集合的大小即为不同布局状态的数量。
投递小米集团等公司10个岗位
0 点赞 评论 收藏
分享
------------------------------------题目一:题目大意:箱子上有 n (1 <= k <= n <= 5e4) 个按钮,每个按钮上的数字在 1 到 k 之间。你需要按顺序选择按钮,形成一个长度为 k 的子序列,要求这个子序列包含 1 到 k 每个数字各一次,并且是所有可能方案中字典序最小的。解法思路:这是一个经典的单调栈问题。核心是贪心思想,遍历数字序列,用一个栈来维护当前最优的子序列。当遇到一个新数字时,如果它比栈顶数字小,并且栈顶数字在后续序列中还会出现,那么就可以将栈顶数字弹出(相当于“反悔”),换入当前这个更小的数字,以获得更优的字典序。通过一个计数数组来记录每个数字的剩余出现次数,以判断是否可以安全地弹出栈顶。------------------------------------题目二:题目大意:给定一个长度为 n (1 <= n <= 100) 的01编码带,以及 m (1 <= m <= 6) 个需要验证的非负整数 (0 <= a_i < 1024)。你需要判断,这 m 个整数各自的二进制表示(不含前导零)能否在编码带中找到对应的、互不重叠的连续片段。(T 组数据, 1 <= T <= 20)解法思路:由于需要验证的数字数量 m 非常小,这指向了搜索算法。首先,预处理出每个数字的二进制字符串,并在编码带中找到它所有可能的匹配位置。然后,使用深度优先搜索(DFS)来为这 m 个数字分配匹配区间。搜索过程中,用一个布尔数组或位集记录编码带上已被占用的位置,确保新分配的区间不与之前的重叠。一个重要的优化是,优先为匹配位置选择最少的数字进行搜索,这样可以更快地剪枝,提高效率。
投递京东等公司10个岗位
0 点赞 评论 收藏
分享
------------------------------------第一题题目大意:年初有 n (1 <= n <= 10^6) 本书需要整理。平时每个月能整理 m (1 <= m <= n) 本。每年从第 p (1 <= p <= 12) 个月开始,有连续 q (1 <= q <= 13-p) 个月的忙碌期,忙碌期内每月能整理 2*m 本。请问整理完所有图书需要多少个月?解法思路:这是一个直接的模拟题。可以设置一个循环,按月推进。在循环中,维护当前是几月份,并根据月份判断是否处于忙碌期 [p, p+q-1] 内。根据是否忙碌,从总任务量 n 中减去 m 或 2*m,同时月份计数器加一。当月份超过12时,重置为1,直到任务量小于等于0为止。------------------------------------第二题题目大意:一个城市有 n (2 <= n <= 2e5) 个节点,由 n-1 条边连接成一棵树。每个节点有一个初始安全标识:'s'(安全), 'd'(危险), 或 '?'(未分类)。一个安全的网络要求任意相连的两个节点标识必须不同(只能是's'或'd')。问最少需要修改多少个节点的标识才能使整个网络变得安全。解法思路:核心是树的二分染色。因为树是二分图,我们可以将所有节点分成两个集合,使得集合内部没有边相连。通过一次图的遍历(BFS或DFS),确定每个节点的层次(奇数层或偶数层)。这样会产生两种合法的染色方案:方案A(偶数层为's',奇数层为'd')和方案B(偶数层为'd',奇数层为's')。分别计算原标识要变成这两种方案需要修改的次数,取其中的较小值即可。------------------------------------第三题题目大意:给定 n (1 <= n <= 1e5) 个道具,每个道具有一个属性值 ai (1 <= ai <= 1e9)。你需要找到一个最短的连续前缀序列(从第一个道具开始),使得这个前缀序列中所有道具属性值的最小公倍数(LCM),恰好等于全部 n 个道具属性值的最小公倍数。输出这个最短序列的长度。(共有 T 组数据, 1 <= T <= 1e4)解法思路:直接计算LCM会超出整数范围,需要转换思路。一个数的LCM由其所有质因子的最高次幂决定。首先,遍历整个数组,对每个数进行质因数分解,用一个哈希表记录下全局LCM所需要的所有质因子及其最高次幂。然后,从头开始遍历数组,同样对每个数分解质因数,用另一个哈希表维护当前前缀的质因子最高次幂。每当一个质因子在前缀中的最高次幂达到了全局要求的最高次幂时,就标记这个质因子已满足。当所有全局需要的质因子都满足时,当前的位置就是最短序列的长度。
投递科大讯飞等公司10个岗位
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务