【笔试刷题】京东-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%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论
大佬 考虑我们不 考虑的话 可以见我主页帖子
点赞 回复 分享
发布于 昨天 21:36 上海

相关推荐

03-29 10:21
西北大学 Java
荆棘花园王座:还在横向慢慢等了只能,鹅的流程是慢点
查看14道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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