小米笔试 小米笔试题 0905
笔试时间:2024年09月05日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目
小A每天都要吃a,b两种面包各一个。而他有n个不同的面包机,不同面包机制作面包的时间各不相同。第i台面包机制作a面包需要花费ai的时间,制作b面包则需要花费bi的时间。为能尽快吃到这两种面包,小A可以选择两个不同的面包机x,y同时工作,并分别制作a,b两种面包,花费的时间将是max(ax,by)。当然,小A也可以选择其中一个面包机x制作a,b两种面包,花费的时间将是ax+bx。为能尽快吃到面包,请你帮小A计算一下,至少需要花费多少时间才能完成这两种面包的制作。
输入描述
第一行一个正整数n,表示面包机的个数。
第二行n个正整数ai,表示面包机制作面包a的时间。
第三行n个正整数bi,表示面包机制作面包b的时间。
输出描述
输出一行一个正整数,表示需要花费的最少时间。
样例输入一
3
2 5 9
4 3 6
样例输出一
3
样例输入二
3
2 5 7
4 3 6
样例输出二
4
参考题解
使用两个变量 minA 和 minB 分别存储制作 a 面包和 b 面包所需的最小时间,分别对应的索引为 minAIndex 和 minBIndex。遍历所有面包机,找到制作 a 和 b 面包的最快面包机。如果制作 a面包和 b 面包所需的最小时间出现在同一台面包机上(即 minAIndex == minBIndex),那么有两种选择:使用同一台面包机制作两种面包,时间为 a[i] + b[i]。寻找其他组合,例如另一台面包机分别制作 a 和 b 面包,这里计算使用其他面包机组合的最小时间,即在剩下的面包机中寻找最大值 max(a[i], b[j]),并取最小的结果。如果 minAIndex != minBIndex,表示可以分别用不同的面包机制作 a 和 b 面包,则直接选择 max(minA, minB),因为这是两台机器同时操作时,耗时最长的机器的时间。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits> // 用于INT_MAX
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n); // 制作A面包的时间
vector<int> b(n); // 制作B面包的时间
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
int minA = INT_MAX;
int minAIndex = -1;
int minB = INT_MAX;
int minBIndex = -1;
for (int i = 0; i < n; i++) {
if (a[i] < minA) {
minA = a[i];
minAIndex = i;
}
if (b[i] < minB) {
minB = b[i];
minBIndex = i;
}
}
int result;
if (minAIndex == minBIndex) {
int minCombined = minA + minB;
int secondBest = INT_MAX;
for (int i = 0; i < n; i++) {
if (i != minAIndex) {
secondBest = min(secondBest, max(a[i], b[minAIndex]));
secondBest = min(secondBest, max(a[minAIndex], b[i]));
}
}
result = min(minCombined, secondBest);
} else {
result = max(minA, minB);
}
cout << result << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取输入
int n = sc.nextInt();
int[] a = new int[n]; // 制作A面包的时间
int[] b = new int[n]; // 制作B面包的时间
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = sc.nextInt();
}
// 找到最小的制作A面包和B面包的时间以及对应的索引
int minA = Integer.MAX_VALUE; // 最小的A面包时间
int minAIndex = -1; // A面包的机器索引
int minB = Integer.MAX_VALUE; // 最小的B面包时间
int minBIndex = -1; // B面包的机器索引
for (int i = 0; i < n; i++) {
if (a[i] < minA) {
minA = a[i];
minAIndex = i;
}
if (b[i] < minB) {
minB = b[i];
minBIndex = i;
}
}
// 计算最终结果
int result;
if (minAIndex == minBIndex) {
// 如果是同一台机器,需要考虑两种情况:
// 1. 同一台机器制作两种面包,时间是 a[i] + b[i]
// 2. 找到第二小的时间组合
int minCombined = minA + minB;
int secondBest = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
if (i != minAIndex) {
secondBest = Math.min(secondBest, Math.max(a[i], b[minAIndex]));
secondBest = Math.min(secondBest, Math.max(a[minAIndex], b[i]));
}
}
result = Math.min(m
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
