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秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
阿里云工作强度 616人发布