网易雷火笔试 网易雷火笔试题 网易笔试 0831

笔试时间:2025年8月31日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:炼金术士

小师妹是一位热爱炼金术的学徒,最近接到了一批紧急订单。她需要利用仓库中的炼金资材,合理规划生产,尽可能满足客户的需求。仓库中存有一批炼金资材,每份资材有对应的等级(1-10级)。小师妹可以:使用一份资材直接制作出一瓶相同等级的炼金药剂。将两瓶相同等级的药剂合成一瓶高一级的药剂(例如:2瓶1级药剂可以合成1瓶2级药剂)。现在有一批订单,每个订单要求提供特定等级的一瓶药剂。小师妹希望能够完成所有订单,或在资材不足的情况下完成尽可能多的订单。

输入描述

第一行:两个整数n和m,分别表示仓库中的炼金资材数量和炼金订单数量。

第二行:n个整数,每个整数范围在1到10之间,表示仓库里的炼金资材等级。

第三行:m个整数,每个整数范围在1到10之间,表示每个订单所需药剂的等级。

补充说明:每个订单,只能用对应等级的药剂来提交。

样例输入

8 5

1 3 4 9 6 6 4 8

1 5 9 3 7

样例输出

7

参考题解

问题的核心在于判断是两种完全不同的策略,这取决于我们是否能满足所有订单。因此,解题思路分为两步:可行性判断: 首先,我们需要判断仓库中的材料是否足够满足所有订单。这里采用一种贪心策略:从最低等级(1级)开始向上检查。对于每个等级,我们计算可用的药剂(包括原始材料和由下一级合成的药剂)。如果当前等级的可用药剂数量少于订单需求,那么就无法满足所有订单。反之,如果能满足,多余的药剂可以两两合成为更高级的药剂,计入到下一级的可用药剂中。如果这个过程能顺利进行到最高级,说明所有订单都可以被满足。根据可行性选择策略:如果可以满足所有订单:目标是使用最少的原材料。为了最节省,我们应该优先使用高级材料满足高级订单,因为用低级材料合成高级药剂成本很高。所以,我们从最高等级(10级)开始向下倒推计算。对于每个等级,我们先用该等级的库存材料满足需求(包括该等级的订单和更高级别传递下来的合成需求)。如果库存不足,缺口就必须由下一级材料合成来补充,这个新的需求会乘以2后传递给下一级。最终,将所有等级实际消耗的原材料数量相加即可。如果无法满足所有订单:目标是完成尽可能多的订单。为了完成更多订单,我们应该优先满足成本低的订单,也就是低等级的订单。所以,我们从最低等级(1级)开始向上正向计算。在每个等级,用所有可用的药剂(原材料+低级合成)去满足该等级的订单,能满足多少就满足多少。然后,将剩余的药剂合成到更高级别。将每个级别能满足的订单数累加,就是最终结果。

C++:

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    long long n, m;
    if (!(cin >> n >> m)) return 0;

    // 下标 0..11,实际使用 1..10,11 是余量“溢出位”
    array<long long, 12> materials_count{}; 
    array<long long, 12> orders_count{};

    for (long long i = 0; i < n; ++i) {
        int x; cin >> x;
        if (0 <= x && x < 12) materials_count[x]++;
    }
    for (long long i = 0; i < m; ++i) {
        int x; cin >> x;
        if (0 <= x && x < 12) orders_count[x]++;
    }

    auto potions_check = materials_count;
    bool can_fulfill_all = true;
    for (int i = 1; i <= 10; ++i) {
        if (potions_check[i] < orders_count[i]) {
            can_fulfill_all = false;
            break;
        }
        potions_check[i + 1] += (potions_check[i] - orders_count[i]) / 2;
    }

    if (can_fulfill_all) {
        array<long long, 12> needed_from_synthesis{};
        long long total_used_materials = 0;
        for (int i = 10; i >= 1; --i) {
            long long total_demand = orders_count[i] + needed_from_synthesis[i];
            long long used_at_this_level = min(total_demand, materials_count[i]);
            total_used_materials += used_at_this_level;
            long long deficit = total_demand - used_at_this_level;
            if (i > 1) needed_from_synthesis[i - 1] = deficit * 2;
        }
        cout << total_used_materials << "\n";
    } else {
        auto potions_greedy = materials_count;
        long long fulfilled_count = 0;
        for (int i = 1; i <= 10; ++i) {
            long long can_fulfill_at_level = min(potions_greedy[i], orders_count[i]);
            fulfilled_count += can_fulfill_at_level;
            potions_greedy[i + 1] += (potions_greedy[i] - can_fulfill_at_level) / 2;
        }
        cout << fulfilled_count << "\n";
    }
    return 0;
}

Java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

publicclass Main {
   public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       StringTokenizer st = new StringTokenizer(br.readLine());
       int n = Integer.parseInt(st.nextToken());
       int m = Integer.parseInt(st.nextToken());

       long[] materials_count = newlong[12];
       st = new StringTokenizer(br.readLine());
       for (int i = 0; i < n; i++) {
           materials_count[Integer.parseInt(st.nextToken())]++;
       }

       long[] orders_count = newlong[12];
       st = new StringTokenizer(br.readLine());
       for (int i = 0; i < m; i++) {
           orders_count[Integer.parseInt(st.nextToken())]++;
       }

       long[] potions_check = Arrays.copyOf(materials_count, 12);
       boolean can_fulfill_all = true;
       for (int i = 1; i <= 10; i++) {
           if (potions_check[i] < orders_count[i]) {
               can_fulfill_all = false;
               break;
           }
           potions_check[i + 1] += (potions_check[i] - orders_count[i]) / 2;
       }

       if (can_fulfill_all) {
           long[] needed_from_synthesis = newlong[12];
           long total_used_materials = 0;
           for (int i = 10; i >= 1; i--) {
               long total_demand = orders_count[i] + needed_from_synthesis[i];
               long used_at_this_level = Math.min(total_demand, materials_count[i]);
               total_used_materials += used_at_this_level;
               long deficit = total_demand - used_at_this_level;
               if (i > 1) {
                   needed_from_synthesis[i - 1] = deficit * 2;
               }
           }
           System.out.println(total_used_materials);
       } else {
           long[] potions_greedy = Arrays.copyOf(materials_count, 12);
           long fulfilled_count = 0;
           for (int i = 1; i <= 10; i++) {
               long can_fulfill_at_level = Math.min(potions_greedy[i], orders_count[i]);
               fulfilled_count += can_fulfill_at_level;
               potions_greedy[i + 1] += (potions_greedy[i] - can_fulfill_at_level) / 2;
           }
           System.out.println(fulfilled_count);
       }
   }
}

Python:

import sys

def main():
    data = sys.stdin.read().strip().split()
    it = iter(data)
    n = int(next(it)); m = int(next(it))

    materials_count = [0] * 12   # 使用下标 1..10,11 为溢出位
    for _ in range(n):
        x = int(next(it))
        if 0 <= x < 12:
            materials_count[x] += 1

    orders_count = [0] * 12
    for _ in range(m):
        x = int(next(it))
        if 0 <= x < 12:
            orders_count[x] += 1

    potions_check = materials_count[:]  # 前向检验是否能全部满足
    can_fulfill_all = True
    for i in range(1, 11):
        if potions_check[i] < orders_count[i]:
            can_fulfill_all = False
            break
        potions_check[i + 1] += (potions_check[i] - orders_count[i]) // 2

    if can_fulfill_all:
        needed_from_synthesis = [0] * 12
        total_used_materials = 0
        for i in range(10, 0, -1):
            total_demand = orders_count[i] + needed_from_synthesis[i]
            used_at_this_level = min(total_demand, materials_count[i])
            total_used_materials += used_at_this_level
            deficit = total_demand - used_at_this_level
            if i > 1:
                needed_from_synthesis[i - 1] = deficit * 2
        print(total_used_materials)
    else:
        potions_greedy = materials_count[:]
        fulfilled_count = 0
        for i in range(1, 11):
            can_fulfill_at_level = min(potions_greedy[i], orders_count[i])
            fulfilled_count += can_fulfill_at_level
            potions_greedy[i + 1] += (potions_greedy[i] - can_fulfill_at_level) // 2
        print(fulfilled_count)

if __name__ == "__main__":
    main()

第二题:采集能量

在《无主星消》的太空战场中,玩家需操控飞船从起点(S)出发,在n*m的网格中以最短时间采集一定能量。飞船每次仅能向上下左右四个方向移动一个网格,能量必须以固定顺序被采集,飞船触碰到能量即视为采集能量。一共有5个能量,依次编号为1~5,玩家必须先采集编号小的能量,即先采集1号,再采集2号......最终采集5号能量。需要你帮玩家算一下,玩家最少移动几次可以采集完5个能量。

网格包含以下元素:

#: 不可穿越的障碍物

.: 可自由航行的太空区域

1~5: 表示5个能量的编号

S: 飞船起点

输入描述

首行:n m 

后续n行,每行m个字符表示n*m的网格的信息。

输出描述

玩家最少所需的移动次数,数据保证一定有解。

样例输入

4 4

1.2.

.##3

.##4

S..5

样例输出

9

参考题解

问题分解:由于能量点必须按 1 到 5 的固定顺序采集,整个复杂的路径规划问题可以被分解为 5 个独立的、连续的最短路径问题:从起点 S 到 1 号能量点。从 1 号到 2 号能量点。从 2 号到 3 号能量点。从 3 号到 4 号能量点。从 4 号到 5 号能量点。核心算法:对于每一个子问题,这都是一个典型的在网格中寻找两点间最短路径的问题。广度优先搜索(BFS)是解决此类问题的标准且最高效的算法。关键约束处理:在为某个阶段(例如,从 1 号点走到 2 号点)进行 BFS 搜索时,必须确保路径不会“提前”经过后续的能量点(例如 3、4、5)。因此,在每次运行 BFS 之前,需要将所有尚未轮到采集的能量点在地图上临时标记为不可通行的障碍物。结果汇总:依次对上述 5 个阶段执行 BFS 计算,并将每个阶段得到的最短移动次数累加起来,最终的总和就是玩家完成任务所需的最少总移动次数。

C++:

#include <bits/stdc++.h>
using namespace std;

int n, m;
vector<string> grid;
int dirs[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};

struct Node { int x, y; };

int bfs(Node start, Node end, int targetId, const array<optional<Node>, 6>& points) {
    vector<vector<int>> dist(n, vector<int>(m, -1));
    vector<vector<char>> forbid(n, vector<char>(m, 0));
    for (int id = targetId + 1; id <= 5; ++id) {
        if (points[id].has_value()) {
            auto p = points[id].value();
            forbid[p.x][p.y] = 1;
        }
    }

    queue<Node> q;
    q.push(start);
    dist[start.x][start.y] = 0;

    while (!q.empty()) {
        Node cur = q.front(); q.pop();
        if (cur.x == end.x && cur.y == end.y) return dist[cur.x][cur.y];
        for (auto &d : dirs) {
            int nx = cur.x + d[0], ny = cur.y + d[1];
            if (nx>=0 && nx<n && ny>=0 && ny<m
                && grid[nx][ny] != '#'
                && dist[nx][ny] == -1
                && !forbid[nx][ny]) {
                dist[nx][ny] = dist[cur.x][cur.y] + 1;
                q.push({nx, ny});
            }
        }
    }
    return -1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    if (!(cin >> n >> m)) return 0;
    grid.assign(n, string());
    array<optional<Node>, 6> points; // 0:S, 1..5
    for (int i = 0; i < n; ++i) {
        cin >> grid[i];
        for (int j = 0; j < m; ++j) {
            char c = grid[i][j];
            if (c == 'S') points[0] = Node{i, j};
            else if (isdigit(static_cast<unsigned char>(c))) {
                int id = c - '0';
                if (1 <= id && id <= 5) points[id] = Node{i, j};
            }
        }
    }

    long long total = 0;
    for (int i = 0; i < 5; ++i) {
        // 假设这些点都存在,和原 Java 一致
        int d = bfs(points[i].value(), points[i+1].value(), i+1, points);
        total += d; // 若不可达则加 -1,与原逻辑一致
    }
    cout << total << "\n";
    return 0;
}

Java:

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

publicclass Main {

   staticint n;
   staticint m;
   staticchar[][] grid;
   staticint[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

   staticclass Node {
       int x, y;

       Node(int x, int y) {
           this.x = x;
           this.y = y;
       }
   }

   p

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论
第一题:是我学不到家吗?题目说只能用对应等级的材料提交订单,为什么样例给了五个订单,输出完成7个订单
点赞 回复 分享
发布于 2025-09-27 13:27 日本

相关推荐

8、超级蚂蚁这是一家做出海休闲游戏的公司,算中大厂,有深圳和长沙两个&nbsp;base,当时是&nbsp;hr&nbsp;主动在&nbsp;boss&nbsp;上和我聊的,我就顺便约面了。11.25&nbsp;面试面试前几天&nbsp;hr&nbsp;给我发了他们正在测试的一款游戏,让我体验一下。1、自我介绍2、我没有玩过&nbsp;33&nbsp;号远征队,你能向我说明一下&nbsp;33&nbsp;号远征队的机制和系统吗这段我答的很烂,主要是之前没接触过这种问题,回答的时候东扯一个系统西扯一个系统,一直在补充。3、关于我们的这款游戏,你能简单说明一下你的理解吗4、我们的这款游戏吸引玩家的点在于什么5、如果让你为这款游戏设计一个系统,你会怎么设计6、这款游戏最吸引你的系统是什么7&nbsp;反问环节改进建议:叙述时的逻辑上还可以加强一些这次表现相较于钛核那次确实差了很多,很多回答都不是很通顺。可能是因为我对于两者的兴趣有差别吧。但是这次给我的影响也很大,在之后的面试中我都会特别注意回答的逻辑。9、微派网络(冬令营)这家算是中大厂,项目主要是偏休闲的游戏(如贪吃蛇)和一些互联网产品(如青藤之恋),我报的是冬令营实习岗,分两期,有转正&nbsp;offer。大家现在去报可能已经迟了,希望能帮助一下明年来报这家冬令营的牛友们吧。11.17&nbsp;网申-11.20&nbsp;笔试-11.24&nbsp;流程终止-12.3&nbsp;补录-12.14&nbsp;面试-12.21oc11.20&nbsp;笔试笔试题比较偏专业,除了第一道其它题都是三选一,还有很多关于巨人的超自然行动组的题。当时我还没玩超自然,都是答的那种很通用的题,理所当然的没有过。12.3&nbsp;补录晚上&nbsp;8&nbsp;点&nbsp;hr&nbsp;加我微信,说因为新开了一个项目所以扩招了,把我又补进去了12.14&nbsp;面试1、自我介绍2、你说你在学习策划方面的专业知识,有关注&nbsp;b&nbsp;站哪些&nbsp;up&nbsp;主吗3、平常学习是怎么学的一般这个问题主要考察你的学习能力,不要说有时间就学,把自己的学习计划说的越详尽越好。4、学习内容有哪些,学过巴图玩家模型吗幸好关于巴图模型我有一些印象,感兴趣的牛友可以去搜一下。5、关于超自然行动组你有哪些改进的建议6、超自然行动组吸引你的有哪些7&nbsp;、如果你要设计一款超自然元素的游戏,你会如何设计,着重设计哪些点。8、最喜欢玩的游戏(这一段是开始问的哈哈,我忘了,现在补在后面)三国杀(说的休闲一点比较好)9、三国杀有哪些消费点10、你提到了皮肤外观,你能说一下皮肤外观是怎么样吸引玩家氪金的吗11、你提到了表现欲和新鲜感,游戏中是怎么利用这些东西促进玩家消费的12、有&nbsp;offer&nbsp;吗其实当时已经有了多益的&nbsp;offer,但是我当时已经不打算去了,而且我怕错过这个机会就回答的没有。13、反问环节询问了改进建议,面试官说表现不错,我问逻辑上还有问题吗,面试官说没有问题。然后说没有什么需要改进的,并且给我上了一课,说策划最重要的是同理心和想象力,逻辑和思维是连接他们的东西。感觉这一段还是很受用的。12.21ochr&nbsp;小姐姐打电话过来,介绍了一下冬令营的具体事项。然后还问了有没有其它&nbsp;offer我说有了多益的&nbsp;offer,巨人&nbsp;hr&nbsp;面完没通知。对这几家公司的意向我回答范围和地点上更偏向微派之后就拿到&nbsp;offer&nbsp;了过了几天就拿到了巨人的&nbsp;offer,和&nbsp;hr&nbsp;沟通了一下就退出了这期冬令营。也很感谢&nbsp;hr&nbsp;的善解人意,hr&nbsp;说很高兴我能拿到更适合和更心仪的&nbsp;offer,最后也是互相祝福温柔收尾目前能总结出大致面经的内容就差不多写完了,后续空闲的时候可能还会再分享一下我策划群面的经验。预祝大家春招顺利啦
查看19道真题和解析
点赞 评论 收藏
分享
头像 会员标识
2025-12-16 14:35
浙江大学 Java
点赞 评论 收藏
分享
评论
3
16
分享

创作者周榜

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