小米笔试 小米笔试题 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多种语言版本,持续更新中。