米哈游笔试 米哈游秋招
笔试时间: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等多种语言做法集合指南