蚂蚁笔试 蚂蚁笔试题 蚂蚁秋招 1009
笔试时间:2025年10月9日
往年笔试合集:
第一题
在一副牌中,数字1-10各有4张。发牌员先后给Tk与wida各发5张牌,此时牌堆还剩30张牌。两名玩家按照下列规则决定胜负:
- 若两人都无法从自己的5张手牌中选出3张牌,使得它们之和为10的倍数,则比较各自手牌中的最大数字,数字较大者获胜;若最大数字相同,则本局平局;
 - 若仅有一人可以选出这样的3张牌,则该名玩家直接获胜;
 - 若两人都可以选出这样的3张牌,则各自都选择一种方案,使得余下2张牌数字之和为x时,比较((x-1) mod 10) + 1的大小(即把0-9中的0视作10),值较大者获胜;若两值相同,则本局平局。
 
现给出两名玩家的手牌,请判断每局比赛的结果。
输入描述
每个测试文件包含多组独立测试数据。第一行输入一个整数N(1≤N≤100)表示测试数据组数,每组测试数据的格式如下:
- 第一行输入5个整数a_i(1≤a_i≤10),表示Tk的手牌;
 - 第二行输入5个整数b_i(1≤b_i≤10),表示wida的手牌。
 
保证输入合法:同一种数字的牌在两人手牌中的总数量不超过4。
输出描述
对于每一组测试数据,新起一行输出比赛结果:
- 若Tk获胜,输出Tk;
 - 若wida获胜,输出wida;
 - 若平局,输出emm。
 
样例输入
3
10 1 9 2 3
6 6 6 6 1
6 6 6 6 1
10 1 9 2 3
3 3 3 1 1
3 2 2 1 1
样例输出
Tk
wida
emm
样例说明:
以第一组测试数据为例:
- Tk可选{10,1,9},三数之和为20,是10的倍数;余下两牌之和为5,对应比较值为5;
 - wida无法选出任意3张牌使其和为10的倍数;
 - 按照规则,只有Tk能凑成10的倍数,故Tk获胜。
 
参考题解
解题思路:
胜负判定分为三种情况:
- 只有一人能凑出10的倍数:直接获胜
 - 两人都不能凑出10的倍数:比较最大单张牌
 - 两人都能凑出10的倍数:比较余下两张牌的和经过特殊计算后的值
 
第一步:判断能否凑出10的倍数
- 从5张牌中选出3张,检查其和是否为10的倍数
 - 由于牌值范围是1-10,10的倍数可能是10、20、30
 - 如果找不到这样的组合,则标记为"不能凑出"
 
第二步:根据不同情况比较胜负
- 情况1:一人能凑,一人不能 - 能凑出10的倍数的人直接获胜
 - 情况2:两人都不能凑 - 比较各自手牌中的最大数字
 - 情况3:两人都能凑 - 计算比较值:((x - 1) % 10) + 1
 
C++:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
pair<bool, int> calu(vector<int>& hs) {
    int max_sc = -1;
    bool flag = false;
    
    // 枚举所有3张牌的组合
    for (int i = 0; i < 5; i++) {
        for (int j = i + 1; j < 5; j++) {
            for (int k = j + 1; k < 5; k++) {
                int sum = hs[i] + hs[j] + hs[k];
                if (sum % 10 == 0) {
                    flag = true;
                    int remain = 0;
                    for (int l = 0; l < 5; l++) {
                        if (l != i && l != j && l != k) {
                            remain += hs[l];
                        }
                    }
                    int cur = ((remain - 1) % 10) + 1;
                    max_sc = max(max_sc, cur);
                }
            }
        }
    }
    
    if (flag) {
        return {true, max_sc};
    } else {
        return {false, *max_element(hs.begin(), hs.end())};
    }
}
void solve() {
    vector<int> tk(5), wida(5);
    for (int i = 0; i < 5; i++) cin >> tk[i];
    for (int i = 0; i < 5; i++) cin >> wida[i];
    
    auto [tkmk, tkval] = calu(tk);
    auto [wdmk, wdval] = calu(wida);
    
    if (tkmk && !wdmk) {
        cout << "Tk" << endl;
        return;
    }
    if (!tkmk && wdmk) {
        cout << "wida" << endl;
        return;
    }
    
    if (tkval > wdval) {
        cout << "Tk" << endl;
    } else if (wdval > tkval) {
        cout << "wida" << endl;
    } else {
        cout << "emm" << endl;
    }
}
int main() {
    int N;
    cin >> N;
    for (int i = 0; i < N; i++) {
        solve();
    }
    return 0;
}
  Java:
import java.util.*;
public class Solution {
    static class Result {
        boolean canMake;
        int value;
        Result(boolean canMake, int value) {
            this.canMake = canMake;
            this.value = value;
        }
    }
    
    static Result calu(int[] hs) {
        int maxSc = -1;
        boolean flag = false;
        
        // 枚举所有3张牌的组合
        for (int i = 0; i < 5; i++) {
            for (int j = i + 1; j < 5; j++) {
                for (int k = j + 1; k < 5; k++) {
                    int sum = hs[i] + hs[j] + hs[k];
                    if (sum % 10 == 0) {
                        flag = true;
                        int remain = 0;
                        for (int l = 0; l < 5; l++) {
                            if (l != i && l != j && l != k) {
                                remain += hs[l];
                            }
                        }
                        int cur = ((remain - 1) % 10) + 1;
                        maxSc = Math.max(maxSc, cur);
                    }
                }
            }
        }
        
        if (flag) {
            return new Result(true, maxSc);
        } else {
            int max = Arrays.stream(hs).max().getAsInt();
            return new Result(false, max);
        }
    }
    
    static void solve(Scanner sc) {
        int[] tk = new int[5];
        int[] wida = new int[5];
        
        for (int i = 0; i < 5; i++) tk[i] = sc.nextInt();
        for (int i = 0; i < 5; i++) wida[i] = sc.nextInt();
        
        Result tkResult = calu(tk);
        Result wdResult = calu(wida);
        
        if (tkResult.canMake && !wdResult.canMake) {
            System.out.println("Tk");
            return;
        }
        if (!tkResult.canMake && wdResult.canMake) {
            System.out.println("wida");
            return;
        }
        
        if (tkResult.value > wdResult.value) {
            System.out.println("Tk");
        } else if (wdResult.value > tkResult.value) {
            System.out.println("wida");
        } else {
            System.out.println("emm");
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        for (int i = 0; i < N; i++) {
            solve(sc);
        }
        sc.close();
    }
}
  Python:
import sys
from itertools import combinations
def calu(hs):
    max_sc = -1
    flag = False
    for combo in combinations(hs, 3):
        if sum(combo) % 10 == 0:
            flag = True
            tmp = list(hs)
            for card in combo:
                tmp.remove(card)
            remain = sum(tmp)
            cur = ((remain - 1) % 10) + 1
            if cur > max_sc:
                max_sc = cur
    if flag:
        return (True, max_sc)
    el
 
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025 春招笔试合集 文章被收录于专栏
 2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

查看20道真题和解析