米哈游笔试 米哈游秋招
笔试时间:2025年8月24日
往年笔试合集:
第一题
在一段史诗般的冒险游戏中,米小游制定了 n 天的任务计划,其中第 i 天目标是收集 aᵢ个魔法晶体;然而,实际第 i 天他收集了 bᵢ个晶体。
为了平衡游戏难度,系统设定如下惩罚机制:
如果第 i 天满足 bᵢ<aᵢ且到第 i 天为止的累计实际收集总量不少于累计目标总量,则需要额外消耗 aᵢ - bᵢ个能量点;
如果第 i 天满足 bᵢ<aᵢ且到第 i 天为止的累计实际收集总量小于累计目标总量,则需要额外消耗 2×(aᵢ - bᵢ) 个能量点。
请计算米小游总共需要额外消耗多少个能量点,以完成整个冒险。
输入描述
第一行输入一个整数 n,表示冒险天数,满足 1≤n≤2×10⁵。
第二行输入 n 个整数 a₁,a₂,…,aₙ,表示每天的目标晶体数,满足 1≤aᵢ≤10⁹。
第三行输入 n 个整数 b₁,b₂,…,bₙ,表示每天的实际晶体数,满足 1≤bᵢ≤10⁹。
输出描述
输出一个整数,表示总额外消耗的能量点数。
样例输入
3
2 1 3
1 2 2
样例输出
4
参考题解
C++:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> a(n), b(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
long long totalPenalty = 0;
long long cumulativeTarget = 0;
long long cumulativeActual = 0;
for (int i = 0; i < n; i++) {
cumulativeTarget += a[i];
cumulativeActual += b[i];
if (b[i] < a[i]) {
long long diff = a[i] - b[i];
if (cumulativeActual >= cumulativeTarget) {
totalPenalty += diff;
} else {
totalPenalty += 2 * diff;
}
}
}
cout << totalPenalty << endl;
return 0;
}
Java:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long[] a = new long[n];
long[] b = new long[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextLong();
}
for (int i = 0; i < n; i++) {
b[i] = sc.nextLong();
}
long totalPenalty = 0;
long cumulativeTarget = 0;
long cumulativeActual = 0;
for (int i = 0; i < n; i++) {
cumulativeTarget += a[i];
cumulativeActual += b[i];
if (b[i] < a[i]) {
long diff = a[i] - b[i];
if (cumulativeActual >= cumulativeTarget) {
totalPenalty += diff;
} else {
totalPenalty += 2 * diff;
}
}
}
System.out.println(totalPenalty);
sc.close();
}
}
Python:
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
total_penalty = 0
cumulative_target = 0
cumulative_actual = 0
for i in range(n):
cumulative_target += a[i]
cumulative_actual += b[i]
if b[i] < a[i]:
diff = a[i] - b[i]
if cumulative_actual >= cumulative_target:
total_penalty += diff
else:
total_penalty += 2 * diff
print(total_penalty)
第二题
米小游和 Zeeman 又在玩游戏了。他们他们面前有 n 堆石子,其中第 i 堆有若干个石子。两人需要轮流从这些石子里面取,由米小游先行。轮到某个玩家取石子时,必须满足以下规则:
首先,玩家选择一个下标 i,且这堆的石子数大于 1;
接下来,玩家需要选择一个正整数 d,满足 d 比这堆的石子数小,并且这堆的石子数能被 d 整除(换句话说,找到一个比这堆石子数小且能整除这堆石子数的正整数 d),并从第 i 堆里取走 d 个石子。如果没有任何满足条件的 d,就不可以选择这一堆。
如果轮到某个玩家时,他无法取走任何石子,则另一个玩家胜利。如果米小游和 Zeeman 都采取最佳策略,请你判断游戏的胜者。
输入描述
输入包含多组测试数据。
第一行输入一个整数 T,表示数据组数,满足 1 ≤ T ≤ 10⁴。
每组测试数据描述如下:第一行输入一个整数 n,表示石子堆数,满足 1 ≤ n ≤ 2×10⁵;第二行输入 n 个整数,依次表示每堆石子的数量,满足每堆石子数大于等于 1 且小于 2³⁰。
保证单个测试文件的所有 n 之和不超过 2×10⁵。
输出描述
对于每组测试数据,输出一行一个字符串:如果米小游是胜者,则输出 Baobao,否则输出 Zeeman。
样例输入
5
2
4 4
1
2
2
114514 1919810
5
16 48 22 12 24
2
4 2
样例输出
Zeeman
Baobao
Zeeman
Zeeman
Baobao
参考题解
这是一个基于尼姆博弈 (Nim Game) 的变种。核心思想:将每堆石子看作一个独立的子游戏。整个游戏的胜负取决于所有子游戏 "状态值" (即 SG 值) 的异或和。异或和规则:如果所有堆的 SG 值异或和不为 0,则先手必胜;如果为 0,则后手必胜。SG 值计算:对于一堆数量为 a 的石子:如果 a 是奇数,它的 SG 值为 0。如果 a 是偶数,它的 SG 值等于 a/2 这个数在二进制下末尾 0 的个数加 1。代码的逻辑就是计算所有偶数堆的 SG 值,然后将它们全部异或起来,根据最终结果判断胜负。
C++:
#include <iostream>
#include <cstdint>
using namespace std;
int main() {
int T;
cin >> T;
while (T-- > 0) {
int n;
cin >> n;
int nimSum = 0;
for (int i = 0; i
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

