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配图神器#
全部评论

相关推荐

0816&nbsp;京东笔试答案第一题,&nbsp;减少逆序对数量对于每个&nbsp;ai,&nbsp;找到&nbsp;所有&nbsp;aj&nbsp;=&nbsp;a[i]&nbsp;+&nbsp;1&nbsp;且&nbsp;j&nbsp;&lt;&nbsp;i&nbsp;的&nbsp;j,&nbsp;则对于选择&nbsp;j&nbsp;&lt;&nbsp;L&nbsp;&lt;=&nbsp;i&nbsp;的&nbsp;L&nbsp;贡献&nbsp;+1,&nbsp;然后做一个前缀和取最大值即可代码```#include&nbsp;&lt;iostream&gt;#include&nbsp;&lt;cstring&gt;#include&nbsp;&lt;algorithm&gt;#include&nbsp;&lt;vector&gt;#include&nbsp;&lt;unordered_map&gt;using&nbsp;namespace&nbsp;std;void&nbsp;solve(){int&nbsp;n;&nbsp;cin&nbsp;&gt;&gt;&nbsp;n;vector&lt;int&gt;&nbsp;a(n&nbsp;+&nbsp;10,&nbsp;0),&nbsp;b(n&nbsp;+&nbsp;10,&nbsp;0),&nbsp;c(n&nbsp;+&nbsp;10,&nbsp;0);unordered_map&lt;int,&nbsp;vector&lt;int&gt;&gt;&nbsp;pos;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i&nbsp;++){cin&nbsp;&gt;&gt;&nbsp;a[i];}for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i&nbsp;++){int&nbsp;v&nbsp;=a[i];int&nbsp;t&nbsp;=&nbsp;v&nbsp;+&nbsp;1;if&nbsp;(pos.find(t)&nbsp;!=&nbsp;pos.end()){for&nbsp;(int&nbsp;j&nbsp;:&nbsp;pos[t]){if&nbsp;(j&nbsp;&lt;&nbsp;i){b[j&nbsp;+&nbsp;1]&nbsp;++;b[i&nbsp;+&nbsp;1]&nbsp;--;}}}pos[v].push_back(i);}int&nbsp;ans&nbsp;=&nbsp;0;int&nbsp;tmp&nbsp;=&nbsp;0;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i&nbsp;++){tmp&nbsp;+=&nbsp;b[i];ans&nbsp;=&nbsp;max(ans,&nbsp;tmp);}cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;}int&nbsp;main(){int&nbsp;_&nbsp;=&nbsp;1;cin&nbsp;&gt;&gt;&nbsp;_;while&nbsp;(_&nbsp;--){solve();}}```第二题,&nbsp;跳水打分解法类似求区间最值,&nbsp;维护每个长度为&nbsp;m&nbsp;的区间的最大值和最小值,&nbsp;然后遍历过去即可算出答案。代码```#include&nbsp;&lt;bits/stdc++.h&gt;#define&nbsp;PII&nbsp;pair&lt;long,&nbsp;long&gt;#define&nbsp;x&nbsp;first#define&nbsp;y&nbsp;secondusing&nbsp;namespace&nbsp;std;int&nbsp;main(){int&nbsp;n,&nbsp;m;cin&nbsp;&gt;&gt;&nbsp;n&nbsp;&gt;&gt;&nbsp;m;priority_queue&lt;PII&gt;&nbsp;maxPq;priority_queue&lt;PII,&nbsp;vector&lt;PII&gt;,&nbsp;greater&lt;PII&gt;&gt;&nbsp;minPq;vector&lt;long&nbsp;long&gt;&nbsp;a(n&nbsp;+&nbsp;10);double&nbsp;ans&nbsp;=&nbsp;0;long&nbsp;long&nbsp;tmp&nbsp;=&nbsp;0;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;i&nbsp;++)&nbsp;cin&nbsp;&gt;&gt;&nbsp;a[i];for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;m;&nbsp;i&nbsp;++){maxPq.push({a[i],&nbsp;i});minPq.push({a[i],&nbsp;i});tmp&nbsp;+=&nbsp;a[i];}long&nbsp;long&nbsp;minV&nbsp;=&nbsp;minPq.top().x;long&nbsp;long&nbsp;maxV&nbsp;=&nbsp;maxPq.top().x;ans&nbsp;=&nbsp;double(tmp&nbsp;-&nbsp;minV&nbsp;-&nbsp;maxV)&nbsp;/&nbsp;(m&nbsp;-&nbsp;2);int&nbsp;ans2&nbsp;=&nbsp;1;int&nbsp;l&nbsp;=&nbsp;1,&nbsp;r&nbsp;=&nbsp;m;while&nbsp;(r&nbsp;&lt;&nbsp;n){//&nbsp;cout&nbsp;&lt;&lt;&nbsp;ans&nbsp;&lt;&lt;&nbsp;endl;tmp&nbsp;-=&nbsp;a[l];&nbsp;l&nbsp;++;r&nbsp;++;&nbsp;tmp&nbsp;+=&nbsp;a[r];minPq.push({a[l],&nbsp;l});&nbsp;minPq.push({a[r],&nbsp;r});maxPq.push({a[l],&nbsp;l});&nbsp;maxPq.push({a[r],&nbsp;r});while&nbsp;(minPq.top().y&nbsp;&lt;&nbsp;l)&nbsp;minPq.pop();while&nbsp;(maxPq.top().y&nbsp;&lt;&nbsp;l)&nbsp;maxPq.pop();if&nbsp;((double(tmp&nbsp;-&nbsp;minPq.top().x&nbsp;-&nbsp;maxPq.top().x)&nbsp;/&nbsp;(m&nbsp;-&nbsp;2))&nbsp;&gt;&nbsp;ans){ans&nbsp;=&nbsp;double(tmp&nbsp;-&nbsp;minPq.top().x&nbsp;-&nbsp;maxPq.top().x)&nbsp;/&nbsp;(m&nbsp;-&nbsp;2);ans2&nbsp;=&nbsp;l;}}cout&nbsp;&lt;&lt;&nbsp;ans2&nbsp;&lt;&lt;&nbsp;endl;}```
投递京东等公司10个岗位
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务