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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论
感谢佬,上面的最值和索引可以统一用下标来表示
点赞 回复 分享
发布于 09-06 10:33 江西
点赞 回复 分享
发布于 09-06 14:55 广东
友塔游戏
校招火热招聘中
官网直投

相关推荐

7 28 评论
分享
牛客网
牛客企业服务