蚂蚁金服笔试 蚂蚁金服笔试题 0414
笔试时间:2024年04月14日
历史笔试传送门:2023秋招笔试合集
第一题
题目:支付宝消费打折
众所周知,在一些消费支付的场合中,往往有“支付宝九五折”的优惠。这天小苯来到了超市购买物品,一共有n种物品,每种物品只能购买一个,但有的物品支持优惠活动,有的并不支持。恰好本超市的结账是有“支付宝九五折”优惠的,小苯的支付宝余额还剩k元,他想知道他仅使用支付宝进行支付的话,最多能买几件物品?
输入描述
输入包含三行。
第一行两个正整数n,k
第二行包含几个正整数 表示每个物品的价格。
第三行一个长度为n的只含有0和1的字符串,表示每个物品是否支持优惠。(如果是1代表第i个物品支持优惠,否则不支持。)
输出描述
输出一行一个整数表示答案。
样例输入
5 9
3 4 2 3 1
11101
样例输出
4
说明
选择买第1,3,4,5个物品。
参考题解
直接贪心,把可以优惠的商品先打折,然后按照价格排序,从小到大选择即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; using ll = long long; int main() { int n, k; cin >> n >> k; vector<double> a(n); for (int i = 0; i < n; ++i) cin >> a[i]; string s; cin >> s; for (int i = 0; i < n; ++i) { if (s[i] == '1') a[i] *= 0.95; } sort(a.begin(), a.end()); double sum = 0; for (int i = 0; i < n; ++i) { sum += a[i]; if (sum > k) { cout << i; return 0; } } cout << n; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); double[] a = new double[n]; for (int i = 0; i < n; ++i) { a[i] = sc.nextDouble(); } String s = sc.next(); for (int i = 0; i < n; ++i) { if (s.charAt(i) == '1') { a[i] *= 0.95; } } Arrays.sort(a); double sum = 0; for (int i = 0; i < n; ++i) { sum += a[i]; if (sum > k) { System.out.println(i); return; } } System.out.println(n); } }
Python:[此代码未进行大量数据的测试,仅供参考]
def main(): import sys input = sys.stdin.read data = input().split() n = int(data[0]) k = int(data[1]) a = [float(data[i + 2]) for i in range(n)] s = data[n + 2] for i in range(n): if s[i] == '1': a[i] *= 0.95 a.sort() sum_ = 0 for i in range(n): sum_ += a[i] if sum_ > k: print(i) return print(n) if __name__ == "__main__": main()
第二题
题目:小红的形状判断
小红正在训练人工智能,其中人工智能有一个很流行的功能是文字识别。现在小红拿到了一个矩形图案,她希望你识别一下这个图案中的字符表示的是字母”L"还是"T”。你能帮帮她吗? 注:图案可能会旋转或者翻转。
输入描述
第一行输入一个正整数q,表示共有q组询问。
接下来会输入q组图案,每组第一行输入两个正整数n, m,代表图案的矩阵行数和列数。
接下来的n行,每行输入一个长度为m的、仅包含.和*的字符串。
1<q<100 3≤n,m < 100 保证字母的宽度为1,且每一笔都是水平或垂直的。
输出描述
输出Q行,代表每次询问的答案。如果是L,则输出一个字符L;如果是T,则输出一个字符T。
样例输入
2
4 4
....
..*.
..*.
***.
样例输出
L
T
说明
第一组询问,可以看成是一个L进行了左右翻转而成。
第二组询问,可以看成是个T逆时针旋转了90度形成的。
参考题解
比较简单,T和L最大的区别在于,如果某个* 周围存在3个*,那么它就是T,否则就是L,因此可以暴力判断每一个 * 的周围存在几个 *。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <string> #include <algorithm> #include <set> using namespace std; using ll = long long; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int main() { int q; cin >> q; while (q--) { int n, m; cin >> n >> m; vector<string> v(n); for (int i = 0; i <
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。