0816京东秋招笔试复盘两道题
#秋招笔面试记录#
------------------------------------
题目一:
题目大意:
给定一个长度为 n (1 <= n <= 1e5) 的序列 a (1 <= a[i] <= n)。你可以执行最多一次操作:选择一个连续区间 [L, R],将区间内所有数字加1。你的目标是最大化操作后能减少的逆序对(能量冲突)数量。(T 组数据)
解法思路:
核心是分析区间加一操作对逆序对的影响。一个逆序对 (i, j) 会被消除,当且仅当 i 不在区间内,j 在区间内,且 a[i] = a[j] + 1。反之,如果 i 在区间内,j 不在区间内,且 a[i] = a[j],则会产生新的逆序对。为了避免产生新的逆序对,最优策略是选择一个后缀区间 [L, n] 进行操作。问题转化为,对于每个 L,计算选择后缀 [L, n] 能消除多少逆序对。这可以通过从后向前遍历 L,同时用两个计数数组分别维护 L 前后各个数值的出现次数,在 O(n) 时间内计算出每个 L 对应的收益,从而找到最大值。
------------------------------------
题目二:
题目大意:
有 n (3 <= m <= n <= 1e5) 位评委,给出 n 个评分。你需要在这 n 个评分中,找到一个长度为 m 的连续区间,使得去掉该区间中的一个最高分和一个最低分后,剩下 m-2 个分数的平均值最大。输出这个最优区间的起始位置(1-indexed)。如果平均值相同,选择起始位置最小的。
解法思路:
由于分母 m-2 是固定的,最大化平均值等价于最大化分子,即 `区间和 - 区间最大值 - 区间最小值`。这个问题可以用滑动窗口来解决。维护一个长度为 m 的窗口,从左到右滑过整个评分数组。为了能在窗口滑动时(增加一个元素,删除一个元素)高效地找到最大值和最小值,需要一个支持快速增删和查询极值的数据结构。C++ 中的 `multiset` 或 Java 中的 `TreeMap` 非常适合此场景,它们可以在 O(log m) 的时间内完成操作。因此,总的时间复杂度为 O(n log m)。在滑动过程中,不断更新最大得分和对应的起始位置即可。z
具体的详细代码和题解可以戳我主页的文章查看
#牛客AI配图神器#
------------------------------------
题目一:
题目大意:
给定一个长度为 n (1 <= n <= 1e5) 的序列 a (1 <= a[i] <= n)。你可以执行最多一次操作:选择一个连续区间 [L, R],将区间内所有数字加1。你的目标是最大化操作后能减少的逆序对(能量冲突)数量。(T 组数据)
解法思路:
核心是分析区间加一操作对逆序对的影响。一个逆序对 (i, j) 会被消除,当且仅当 i 不在区间内,j 在区间内,且 a[i] = a[j] + 1。反之,如果 i 在区间内,j 不在区间内,且 a[i] = a[j],则会产生新的逆序对。为了避免产生新的逆序对,最优策略是选择一个后缀区间 [L, n] 进行操作。问题转化为,对于每个 L,计算选择后缀 [L, n] 能消除多少逆序对。这可以通过从后向前遍历 L,同时用两个计数数组分别维护 L 前后各个数值的出现次数,在 O(n) 时间内计算出每个 L 对应的收益,从而找到最大值。
------------------------------------
题目二:
题目大意:
有 n (3 <= m <= n <= 1e5) 位评委,给出 n 个评分。你需要在这 n 个评分中,找到一个长度为 m 的连续区间,使得去掉该区间中的一个最高分和一个最低分后,剩下 m-2 个分数的平均值最大。输出这个最优区间的起始位置(1-indexed)。如果平均值相同,选择起始位置最小的。
解法思路:
由于分母 m-2 是固定的,最大化平均值等价于最大化分子,即 `区间和 - 区间最大值 - 区间最小值`。这个问题可以用滑动窗口来解决。维护一个长度为 m 的窗口,从左到右滑过整个评分数组。为了能在窗口滑动时(增加一个元素,删除一个元素)高效地找到最大值和最小值,需要一个支持快速增删和查询极值的数据结构。C++ 中的 `multiset` 或 Java 中的 `TreeMap` 非常适合此场景,它们可以在 O(log m) 的时间内完成操作。因此,总的时间复杂度为 O(n log m)。在滑动过程中,不断更新最大得分和对应的起始位置即可。z
具体的详细代码和题解可以戳我主页的文章查看
#牛客AI配图神器#
全部评论
相关推荐

点赞 评论 收藏
分享

点赞 评论 收藏
分享

点赞 评论 收藏
分享
点赞 评论 收藏
分享