【秋招笔试】2025.0826滴滴秋招机考真题改编
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线140+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
题目一:游戏道具强化系统
1️⃣:使用大根堆维护所有非主武器装备的强化等级
2️⃣:贪心策略:每次选择强化等级最高的装备进行操作
3️⃣:利用操作后主武器强化等级只与被选装备有关的性质
难度:中等
这道题目的关键在于理解强化操作的本质:每次操作后主武器的强化等级完全由被选择装备决定。通过贪心策略选择当前强化等级最高的装备,可以让主武器尽快达到最大强化等级,从而用最少操作次数达成目标。
题目二:图书馆藏书收集
1️⃣:理解移动规则:借阅古籍后只能向右,不借阅只能向下
2️⃣:使用动态规划,状态为到达某行某列的最大价值
3️⃣:考虑连续借阅策略和两种离开图书馆的方式
难度:中等偏难
这道题目需要深刻理解题目的移动约束,并设计合适的动态规划状态。通过分析移动规则,可以发现每行的借阅必须是连续的,这为状态转移提供了重要线索。算法需要综合考虑多种离开图书馆的策略来获得最优解。
01. 游戏道具强化系统
问题描述
小兰正在玩一款热门的RPG游戏,她拥有一套装备系统。每件装备都有一个强化等级,用正整数表示。小兰有 件装备,其中第一件装备是她的主武器,编号为
,其余装备编号依次为
。
游戏中有一个特殊的强化机制:小兰可以选择任意一件非主武器的装备(编号 ),将其一部分强化等级转移给主武器。具体来说,如果选择编号为
的装备进行操作:
- 设
(第
件装备强化等级向下取整的一半)
- 主武器的新强化等级:
(增加转移的强化等级)
- 第
件装备的新强化等级:
(减少转移的强化等级)
小兰希望通过若干次这样的操作,使得她的主武器成为所有装备中强化等级最高的,即对于任意的 (
),都满足
。
请你计算出达成这个目标所需的最少操作次数。
输入格式
输入包含多组测试数据。
第一行包含一个正整数 (
),表示测试数据的组数。
对于每组测试数据:
第一行包含一个整数 (
),表示装备的数量。
第二行包含 个整数
(
),表示每件装备的初始强化等级。
保证每个测试点的所有测试数据的 的和不超过
。
输出格式
对于每组测试数据,输出一个非负整数,表示使得主武器成为强化等级最高装备的最少操作次数。
样例输入
2
3
2 4 5
2
3 2
样例输出
2
0
样例 | 解释说明 |
---|---|
样例1 | 初始状态:[2,4,5]。第一次操作选择装备3(强化等级5),x=⌊5/2⌋=2,主武器变为2+2=4,装备3变为5-2=3,状态变为[4,4,3]。第二次操作选择装备2(强化等级4),x=⌊4/2⌋=2,主武器变为4+2=6,装备2变为4-2=2,状态变为[6,2,3]。此时主武器是最大值,共需2次操作 |
样例2 | 初始状态:[3,2]。主武器强化等级3已经大于装备2的强化等级2,无需任何操作 |
数据范围
- 保证每个测试点的所有测试数据的
的和不超过
题解
这道题的关键是贪心策略:每次都选择当前强化等级最高的非主武器装备进行操作,这样能最大化主武器获得的强化等级。
算法思路:
- 将除主武器外的所有装备强化等级放入大根堆中
- 只要主武器的强化等级不大于堆顶元素,就执行以下操作:
- 取出当前最大强化等级的装备
- 计算转移的强化等级:
- 主武器增加
:
- 该装备减少
:
- 将更新后的装备强化等级重新放入堆中
- 操作次数加1
- 取出当前最大强化等级的装备
- 重复直到主武器强化等级超过所有其他装备
时间复杂度:每次操作涉及一次堆的弹出和插入,时间复杂度为 。由于每次操作都会让最大值减半,最多需要
次操作,总时间复杂度为
。
参考代码
- Python
import sys
import heapq
input = lambda: sys.stdin.readline().strip()
def solve():
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
# 主武器强化等级
main_lvl = a[0]
# 创建大根堆(Python使用负数实现)
heap = []
for i in range(1, n):
heapq.heappush(heap, -a[i])
ops = 0 # 操作次数
# 当主武器不是最强时继续操作
while heap and main_lvl <= -heap[0]:
# 取出当前最强装备
max_val = -heapq.heappop(heap)
# 计算转移的强化等级
x = max_val // 2 # floor(max_val/2)
# 更新强化等级
main_lvl += x # 主武器增加x
new_equip = max_val - x # 装备减少x
# 将更新后的装备强化等级放回堆中
heapq.heappush(heap, -new_equip)
ops += 1
print(ops)
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 主武器强化等级
long long main_lvl = a[0];
// 创建大根堆
priority_queue<long long> pq;
for (int i = 1; i < n; i++) {
pq.push(a[i]);
}
int ops = 0; // 操作次数
// 当主武器不是最强时继续操作
while (!pq.empty() && main_lvl <= pq.top()) {
// 取出当前最强装备
long long max_val = pq.top();
pq.pop();
// 计算转移的强化等级
long long x = max_val / 2; // floor(max_val/2)
// 更新强化等级
main_lvl += x; // 主武器增加x
long long new_equip = max_val - x; // 装备减少x
// 将更新后的装备强化等级放回堆中
pq.push(new_equip);
ops++;
}
cout << ops << "\n";
}
return 0;
}
- Java
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
int n = Integer.parseInt(br.readLine());
String[] parts = br.readLine().split(" ");
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = Long.parseLong(parts[i]);
}
// 主武器强化等级
long mainLvl = a[0];
// 创建大根堆
PriorityQueue<Long> pq = new PriorityQueue<>(Collections.reverseOrder());
for (int i = 1; i < n; i++) {
pq.offer(a[i]);
}
int ops = 0; // 操作次数
// 当主武器不是最强时继续操作
while (!pq.isEmpty() && mainLvl <= pq.peek()) {
// 取出当前最强装备
long maxVal = pq.poll();
// 计算转移的强化等级
long x = maxVal / 2; //
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力