2023 蚂蚁金服笔试题 0914 B卷

笔试时间:2023年9月14日 秋招

备注:第三题题解待更新。

第一题

题目:最优化存储

支付宝服务亿级消费者,每个支付宝的用户有自己独特的信息,假设每个会员存储的成本为ai,现在有n个会员,和m块存储容器,希望用该容器存储更多的会员信息。存储优化是个相当复杂的过程,为了简化问题,存储规则如下:

1、每个会员的存储成本可以用长度ai的线段表示。存储容器m块,每块可以用一段线段bi表示;

2、存诸容器有个特性,如果会员i存储在容器中间位置(非两端即为中间),存储成本为ai本身,但是线段容器两端有存储压缩技术,存储在靠两端位置的会员存储成本可以压缩到一半,即ai/2,而且每个会员只能压缩一次。

现在n个会员,每个会员存储成本为ai,以及有m块存储资源bi,希望你做存储优化,求能存储最大的会员数量是多少?

输入描述

第一行输入两个正整数n和m,用空格隔开。代表会员数量、最大存储空间;

第二行输入n个正整数ai,代表每个会员的存储成本;

第三行输入m个正整数bi,代表每块存储容器的长度。

1 <= n, m <= 10^5

1 <= ai <= 2

1<= bi <= 2

输出描述

一个整数,代表最大的信息量之和。

样例输入

5 2

1 2 2 1 2

2 1

样例输出

4

提示

选择前四个会员,将第二个和第三个的会员信息放在第一个容器的两端位置,将第一个和第四个会员的信息放在第二个容器的两端位置

参考题解

贪心,先把会员长度1的贪心,再对会员长度2的贪心。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
using namespace std;

const int MAX_N = 3; // 最大数量
int s[MAX_N], t[MAX_N]; // 计数数组

int main() {
    int n, m, x;
    cin >> n >> m;

    // 初始化计数数组
    for (int i = 0; i < n; i++) {
        cin >> x;
        s[x]++;
    }
    for (int i = 0; i < m; i++) {
        cin >> x;
        t[x]++;
    }

    int ans = 0;

    // 处理s[1]
    while (s[1] > 0) {
        if (t[1] > 0) {
            int x = min(2, s[1]);
            ans += x;
            s[1] -= x;
            t[1]--;
        } else if (t[2] > 0) {
            int x = min(3, s[1]);
            if (x == 1 && s[2] > 0) {
                ans++;
                s[2]--;
            }
            ans += x;
            s[1] -= x;
            t[2]--;
        } else {
            break;
        }
    }

    // 处理s[2]
    while (s[2] > 0) {
        if (t[1] > 0) {
            ans++;
            s[2]--;
            t[1]--;
        } else if (t[2] > 0) {
            int x = min(2, s[2]);
            ans += x;
            s[2] -= x;
            t[2]--;
        } else {
            break;
        }
    }

    cout << ans << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int MAX_N = 3;
        int[] s = new int[MAX_N];
        int[] t = new int[MAX_N];

        int n = scanner.nextInt();
        int m = scanner.nextInt();

        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            s[x]++;
        }

        for (int i = 0; i < m; i++) {
            int x = scanner.nextInt();
            t[x]++;
        }

        int ans = 0;

        while (s[1] > 0) {
            if (t[1] > 0) {
                int x = Math.min(2, s[1]);
                ans += x;
                s[1] -= x;
                t[1]--;
            } else if (t[2] > 0) {
                int x = Math.min(3, s[1]);
                if (x == 1 && s[2] > 0) {
                    ans++;
                    s[2]--;
                }
                ans += x;
                s[1] -= x;
                t[2]--;
            } else {
                break;
            }
        }

        while (s[2] > 0) {
            if (t[1] > 0) {
                ans++;
                s[2]--;
                t[1]--;
            } else if (t[2] > 0) {
                int x = Math.min(2, s[2]);
   

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

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

猿辅导 Java后端日常实习 800一天
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 1 评论
分享
牛客网
牛客企业服务