京东笔试 京东笔试题 0802
笔试时间:2025年8月2日
往年笔试合集:
第一题:排队
某个银行只有一个营业员,只能同时办理一个人的业务。因为营业员人数有限,所以除了首个办理业务的人之外,其他所有人都需要等待前一个办理业务的人办理完成。
假设现在有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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

查看5道真题和解析