【秋招笔试】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. 将除主武器外的所有装备强化等级放入大根堆中
  2. 只要主武器的强化等级不大于堆顶元素,就执行以下操作:
    • 取出当前最大强化等级的装备
    • 计算转移的强化等级:
    • 主武器增加
    • 该装备减少
    • 将更新后的装备强化等级重新放入堆中
    • 操作次数加1
  3. 重复直到主武器强化等级超过所有其他装备

时间复杂度:每次操作涉及一次堆的弹出和插入,时间复杂度为 。由于每次操作都会让最大值减半,最多需要 次操作,总时间复杂度为

参考代码

  • 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%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

应届生直接被毁约。宿舍里去华为的体检都被卡住了,入职不了,关键是身体没有任何问题,出具诊断证明也屁用没有,华为那边根本不搭理,问hr问部门问管理员一问三不知,最后直接不搭理了,甩过来一个终止流程,welink直接销户,联系不上了。目前据我所知体检卡住的不下百人了,签offer签了大半年了,一切顺利,然后来一句体检不通过,复检不允许,证明不接受,入职前直接因为体检一件小事让你失业的吗?纯纯傻逼华为这两年某些部门业绩不好,整体在走下坡路,结果管理层、人力资源部门一拍脑袋,变相裁员都裁到应届生头上了!想体验应届生直接被毁约。宿舍里去华为的体检都被卡住了,入职不了,关键是身体没有任何问题,出具诊断证明也屁用没有,华为那边根本不搭理,问hr问部门问管理员一问三不知,最后直接不搭理了,甩过来一个终止流程,welink直接销户,联系不上了。目前据我所知体检卡住的不下百人了,签offer签了大半年了,一切顺利,然后来一句体检不通过,复检不允许,证明不接受,入职前直接因为体检一件小事让你失业的吗?纯纯傻逼据我所知今年体检卡住不能入职的有上百人了华为这两年某些部门业绩不好,整体在走下坡路,结果管理层、人力资源部门一拍脑袋,变相裁员都裁到应届生头上了!想体验任人宰割、当牛做马,人家说啥你就是啥的滋味就投华为吧,落到自己头上就知道什么叫小丑了🤡😈😈😈
pickring_o...:灭六国者,六国也,非秦也。族秦者,秦也,非天下也。
机械人还在等华为开奖吗?
点赞 评论 收藏
分享
投递滴滴等公司10个岗位
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务