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

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

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

全部评论

相关推荐

点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
评论
3
5
分享
牛客网
牛客企业服务