京东笔试 京东笔试题 0802

笔试时间:2025年8月2日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:排队

某个银行只有一个营业员,只能同时办理一个人的业务。因为营业员人数有限,所以除了首个办理业务的人之外,其他所有人都需要等待前一个办理业务的人办理完成。

假设现在有n个人需要办理业务,第i个人的业务需要办理a[i]分钟。

由于业务的特殊性,第i个人每等1分钟,他最终办理业务的时间就会多b[i]分钟。

作为志愿者,你的任务就是安排他们的先后顺序,使每个人办理业务的总时间(包括等待时间)之和最小。

输入描述

第一行一个数n,表示有n个人(1<=n<=10000)。

接下来n行,每行两个数a[i],bi。

输出描述

一行一个整数,输出最小时间。如果答案过大,需要对10000000009取模(求余)。

样例输入

2

1 1

2 5

样例输出

5

提示:若第1个人先办理业务,然后第2个人办理业务: 第1个人办理业务的时间是1分钟 第2个人办理业务的时间是2+15=7分钟 总时间之和为8分钟 若第2个人先办理业务,然后第1个人办理业务: 第2个人办理业务的时间是2分钟 第1个人办理业务的时间是1+21=3分钟 总时间之和为5分钟 所以最小时间是5分钟。

参考题解

每个人的业务办理时间包括基础时间a[i]和等待时间乘以系数b[i](即每等待1分钟,业务时间增加b[i]分钟)。最优的排序策略是按照a[i]/b[i]的比值从小到大排序,这样可以最小化总时间。计算总时间时,我们模拟每个人的办理过程,累加每个人的实际时间,并更新等待时间总和。通过贪心策略,将a[i]/b[i]比值最小的人排在前面。这等价于比较a[i]*b[j]和a[j]*b[i]:若a[i]*b[j] < a[j]*b[i],则i应排在j前面。按排序顺序处理每个人,计算每个人的实际时间T = a[i] + 当前等待时间总和 * b[i]。累加每个人的实际时间得到总时间,并更新等待时间总和。

C++:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll mod = 1000000009;

struct Pair {
    ll a, b;
};

bool cmp(const Pair &x, const Pair &y) {
    return x.a * y.b < y.a * x.b;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<Pair> arr(n);

    for (int i = 0; i < n; i++) {
        cin >> arr[i].a >> arr[i].b;
    }

    sort(arr.begin(), arr.end(), cmp);

    ll total_time = 0;
    ll current_sum = 0;

    for (auto &p : arr) {
        ll T = (p.a + current_sum * p.b) % mod;
        total_time = (total_time + T) % mod;
        current_sum = (current_sum + T) % mod;
    }

    cout << total_time << "\n";
    return 0;
}

Java:

import java.util.*;

public class Main {
    static final long mod = 1000000009L;

    static class Pair {
        long a, b;
        Pair(long a, long b) {
            this.a = a;
            this.b = b;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<Pair> arr = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            long a = sc.nextLong();
            long b = sc.nextLong();
            arr.add(new Pair(a, b));
        }

        arr.sort((x, y) -> {
            long cmp = x.a * y.b - y.a * x.b;
            if (cmp < 0) return -1;
            else if (cmp > 0) return 1;
            return 0;
        });

        long total_time = 0;
        long current_sum = 0;

        for (Pair p : arr) {
            long T = (p.a + current_sum * p.b) % mod;
            total_time = (total_time + T) % mod;
            current_sum = (current_sum + T) % mod;
        }

        System.out.println(total_time);
    }
}

Python:

import functools

mod = 1000000009
n = int(input())
arr = []
for _ in range(n):
    a, b = map(int, input().split())
    arr.append((a, b))

def cmp(x, y):
    a1, b1 = x
    a2, b2 = y
    if a1 * b2 < a2 * b1:
        return -1
    elif a1 * b2 >

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

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