【笔试刷题】京东-2026.03.28-第二套-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
京东-2026.03.28-第二套
京东-2026.03.28-第二套
这套题更像标准机考配置。第一题是很典型的“排序 + 二分答案”,重点在于只关注中位数右侧;第二题则是双目标资源分配,状态设计比实现本身更关键。
题目一:药水强化后的最高中位值
真正会影响中位数的只有排序后中间到末尾这一段。把目标中位数二分出来,再统计把这些位置补到目标值所需的总操作数即可。
难度:中等
题目二:星际快递
不能按单个包裹贪心,而要同时记录“已经送了多少件”和“已经用了多少张通行证”。倒序转移的二维 DP 可以自然处理题目的双层目标。
难度:中等
1. 药水强化后的最高中位值
问题描述
小基 手里有 瓶药水,第
瓶药水的初始强度为
。题目保证
是奇数。
现在还有 次强化机会。每次强化都可以任选一瓶药水,让它的强度增加
。
所有强化结束后,把这 个强度值从小到大排序。请计算排序后中位数能够达到的最大值。
这里的中位数指第 个数。
输入格式
第一行输入两个整数 、
。
第二行输入 个整数
。
输出格式
输出一个整数,表示可以达到的最大中位数。
样例输入
5 7
1 2 5 6 6
样例输出
8
数据范围
为奇数
| 样例 | 解释说明 |
|---|---|
| 样例1 | 把第三瓶药水加 |
题解
先想清楚谁会影响中位数
把数组排好序以后,记中位位置为 。
想让中位数变大,只需要关心从 mid 到末尾这一段:
- 左边那些更小的数,就算继续变小,也不会拖住中位数。
- 真正决定中位数下限的是中位位置以及它右边的元素。
所以排序之后,只需要考虑把区间 里偏小的数往上补。
如何判断某个答案是否可行
假设目标中位数是 。
那么想让最终中位数至少为 ,排序后从
mid 到末尾这一段里,所有小于 的元素都必须被补到
。
需要的强化次数就是:
如果 ,就说明
可以做到;否则做不到。
这个可行性具有单调性:
- 某个值
能做到。
- 那么所有不超过
的值也都能做到。
因此可以直接二分答案。
为什么这样不会漏
排序后,中位数至少为 的充要条件就是:
- 中位位置上的数不小于
。
而要让这个位置不小于 ,比它更靠右的位置也不能比
更小,否则排序后这些更小的数还会挤到中位位置之前。
所以只要把右半段中所有小于 的数补齐,就已经是最省操作的可行方案。
复杂度分析
排序一次后,每次二分检查都只扫后半段。
- 时间复杂度:
,其中
是答案范围。
- 空间复杂度:
,不计排序使用的额外空间。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
n, k = map(int, input().split())
a = list(map(int, input().split()))
a.sort()
mid = n // 2
# 判断目标中位数 val 是否可行。
def ok(val):
need = 0
for i in range(mid, n):
if a[i] < val:
need += val - a[i]
if need > k:
return False
return True
l = a[mid]
r = a[mid] + k
while l < r:
m = (l + r + 1) // 2
if ok(m):
l = m
else:
r = m - 1
print(l)
if __name__ == "__main__":
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
long long k;
cin >> n >> k;
vector<long long> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
sort(a.begin(), a.end());
int mid = n / 2;
auto ok = [&](long long val) {
long long need = 0;
for (int i = mid; i < n; ++i) {
if (a[i] < val) {
need += val - a[i];
if (need > k) {
return false;
}
}
}
return true;
};
long long l = a[mid];
long long r = a[mid] + k;
while (l < r) {
long long m = (l + r + 1) >> 1;
if (ok(m)) {
l = m;
} else {
r = m - 1;
}
}
cout << l << '\n';
return 0;
}
- Java
import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.Arrays;
public class Main {
static class FastScanner {
private final BufferedInputStream in = new BufferedInputStream(System.in);
private final byte[] buf = new byte[1 << 16];
private int len = 0;
private int ptr = 0;
private int read() throws IOException {
if (ptr >= len) {
len = in.read(buf);
ptr = 0;
if (len <= 0) {
return -1;
}
}
return buf[ptr++];
}
long nextLong() throws IOException {
int c;
do {
c = read();
} while (c <= ' ' && c != -1);
long sgn = 1;
if (c == '-') {
sgn = -1;
c = read();
}
long val = 0;
while (c > ' ') {
val = val * 10 + c - '0';
c = read();
}
return val * sgn;
}
}
static long[] a;
static int n;
static long k;
static int mid;
static boolean ok(long val) {
long need = 0;
for (int i = mid; i < n; ++i) {
if (a[i] < val) {
need += val - a[i];
if (need > k) {
return false;
}
}
}
return true;
}
public static void main(String[] args) throws Exception {
FastScanner fs = new FastScanner();
n = (int) fs.nextLong();
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

查看14道真题和解析