大厂真题 / 蚂蚁

蚂蚁 2026 春招笔试真题 - 研发岗(3.29)

本场考试概述

考试时间:2026年3月29日 考试岗位:研发岗 难度评级:中等偏难

考点分析

  • 第一题:排序 + 贪心(难度中等)
  • 第二题:素数筛 + 计数(难度中等)
  • 第三题:逐位贪心 + 上界约束枚举(难度困难)

建议策略

  • 前两题是常规算法题,掌握排序贪心和素数筛即可拿满
  • 第三题位运算贪心有一定思维难度,需要熟悉”数位枚举”套路

第一题:巴巴博弈

题目描述

n 份礼物价值为 a[i]。天才同学先拿走 k 份,AK机看到剩余礼物后从中选取不超过 m 份使总价值至少为 y。求最小的 m,使得无论天才怎么拿,AK机都能达标。若不可能输出 -1。

样例

输入

2
5 2 10
1 2 3 4 5
4 1 7
5 2 4 3

输出

-1
2

题解:排序 + 贪心

天才的最优策略:拿走价值最大的 k 个。AK机从剩余中贪心选最大的累加直到 >= y。

时间复杂度:O(n log n)。

import sys
input = sys.stdin.readline

def solve(a, k, y):
    a.sort(reverse=True)
    s = 0
    for i in range(k, len(a)):
        s += a[i]
        if s >= y:
            return i - k + 1
    return -1

t = int(input())
out = []
for _ in range(t):
    n, k, y = map(int, input().split())
    a = list(map(int, input().split()))
    out.append(str(solve(a, k, y)))
print("\n".join(out))

第二题:质数合数

题目描述

给定长度为 n 的全素数数组,计算满足 a[i]+a[j] 为合数的有序二元组 (i,j) 的数量(i != j)。

样例

输入

5
2 2 3 3 2

输出

8

题解:正难则反 + 素数奇偶性分析

合数对数 = 总对数 n*(n-1) - 和为素数的对数。

两个质数之和:奇+奇 >= 6 一定是合数;偶+偶 = 4 是合数;只有 2+p 且 p+2 也是素数时和才是素数。

设 cnt2 为 2 的个数,cntTwin 为满足 p+2 是素数的奇素数个数。答案 = n(n-1) - 2cnt2*cntTwin。

时间复杂度:O(n + V)。

import sys
input = sys.stdin.readline

def sieve(max_v):
    is_prime = [True] * max_v
    is_prime[0] = is_prime[1] = False
    for i in range(2, int(max_v**0.5) + 1):
        if is_prime[i]:
            for j in range(i * i, max_v, i):
                is_prime[j] = False
    return is_prime

is_prime = sieve(200003)
n = int(input())
a = list(map(int, input().split()))
cnt2 = cnt_twin = 0
for x in a:
    if x == 2:
        cnt2 += 1
    elif is_prime[x + 2]:
        cnt_twin += 1
print(n * (n - 1) - 2 * cnt2 * cnt_twin)

第三题:位运算权值

题目描述

给定长度为 n 的整数序列 a 和操作字符串 s(每个字符为 1/2/3,分别对应 AND/XOR/OR)。在 [1, r] 中选一个整数 x,最大化所有位运算结果之和。

样例

输入

3
3 7
1 2 3
123
4 3
1 1 1 1
1111
5 10
5 6 7 8 9
23231

输出

15
4
60

题解:逐位贪心 + 上界约束枚举

位运算的第 b 位只影响所有 a[i] 第 b 位的结果,因此可以对每一位独立计算贡献 g1[b](x 该位为 1)和 g0[b](x 该位为 0)。

处理 x <= r 的约束:枚举 r 二进制中哪一位”脱离”(将 1 改为 0 使 x < r),高位保持与 r 一致,低位自由选最优。

时间复杂度:O(n * B + B^2),B = 30。

import sys
input = sys.stdin.readline

BITS = 30

def solve(a, s, r):
    n = len(a)
    g1 = [0] * BITS
    g0 = [0] * BITS
    for i in range(n):
        for b in range(BITS):
            bit_a = (a[i] >> b) & 1
            pw = 1 << b
            if s[i] == '1':
                g1[b] += bit_a * pw
            elif s[i] == '2':
                g1[b] += (1 - bit_a) * pw
                g0[b] += bit_a * pw
            else:
                g1[b] += pw
                g0[b] += bit_a * pw

    best = sum(g1[b] if (r >> b) & 1 else g0[b] for b in range(BITS))

    for split in range(BITS):
        if not ((r >> split) & 1):
            continue
        val = 0
        x_val = 0
        for b in range(BITS - 1, split, -1):
            if (r >> b) & 1:
                val += g1[b]
                x_val |= 1 << b
            else:
                val += g0[b]
        val += g0[split]
        for b in range(split - 1, -1, -1):
            if g1[b] >= g0[b]:
                val += g1[b]
                x_val |= 1 << b
            else:
                val += g0[b]
        if x_val == 0:
            val = val - g0[0] + g1[0]
        best = max(best, val)
    return best

t = int(input())
out = []
for _ in range(t):
    n, r = map(int, input().split())
    a = list(map(int, input().split()))
    s = input().strip()
    out.append(str(solve(a, s, r)))
print("\n".join(out))

小结

  • 第一题排序 + 贪心,关键是想清楚天才的最优策略:拿走最大的 k 个
  • 第二题正难则反 + 素数奇偶性分析,只有 2+p 且 p+2 是素数的对才不是合数
  • 第三题逐位贪心 + 上界约束枚举是位运算题的经典套路,需要熟悉”数位 DP”思想