网易互娱笔试 网易互娱笔试题 0621

笔试时间:2024年06月21日

历史笔试传送门:2023秋招笔试合集

第一题

题目

小易正在参加阴阳师的斗技。已知斗技的规则是,双方各上5名式神,谁先击败对方所有角色谁就获胜了。本题为了简化,可以假设每个式神均为单体攻击,每回合玩家将出动自己的一号式神,攻击对方的一号式神,当一号式神血量降到0或0以下时,则式神死亡,二号变成一号。当一方发动攻击时,受到攻击的式神的血量将减去攻击方的攻击力。双方轮流攻击,小易先手攻击,现在小易想知道,最终谁将获得游戏胜利,胜利的一方还剩多少个存活的式神?

输入描述

第一行输入5个正整数,代表小易从1号到5号每个式神的攻击力。

第二行输入5个正整数,代表小易从1号到5号每个式神的血量。

第三行输入5个正整数,代表小易的对手从1号到5号每个式神的攻击力。

第四行输入5个正整数,代表小易的对手从1号到5号每个式神的血量。

1<=ai,bi,ci,di<=10^4。

输出描述

第一行为一个字符串,表示胜利的一方。如果小易获胜,则输出"win";否则输出"lose"。

第二行为一个正整数,表示胜利一方剩余的存活式神的数量。

样例输入一

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

样例输出一

win

1

解释:共进行5回合,前四回合双方各战死一名式神,第五回合小易攻击后获得胜利,最终小易还剩一个式神。

样例输入二

2 3 4 5 6

6 5 4 3 2

10 1 1 1 1

1000 1 1 1 1

样例输出二

lose

5

参考题解

我们可以模拟这个斗技的过程。每次小易的式神和对方的式神交替攻击。我们使用队列或者列表模拟每个玩家的式神队列。每当一个式神的血量降至0或以下时,就移动到下一个位置。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> a(5), b(5), c(5), d(5);
    for (int i = 0; i < 5; ++i) {
        cin >> a[i];
    }
    for (int i = 0; i < 5; ++i) {
        cin >> b[i];
    }
    for (int i = 0; i < 5; ++i) {
        cin >> c[i];
    }
    for (int i = 0; i < 5; ++i) {
        cin >> d[i];
    }

    int op = 0, idx1 = 0, idx2 = 0;

    while (idx1 < 5 && idx2 < 5) {
        if (op % 2 == 0) {
            d[idx2] -= a[idx1];
            if (d[idx2] <= 0) {
                idx2++;
            }
        } else {
            b[idx1] -= c[idx2];
            if (b[idx1] <= 0) {
                idx1++;
            }
        }
        op++;
    }

    if (idx1 < 5) {
        int ans = 5 - idx1;
        cout << "win" << endl;
        cout << ans << endl;
    } else {
        int ans = 5 - idx2;
        cout << "lose" << endl;
        cout << ans << endl;
    }

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] a = new int[5];
        int[] b = new int[5];
        int[] c = new int[5];
        int[] d = new int[5];

        for (int i = 0; i < 5; ++i) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < 5; ++i) {
            b[i] = sc.nextInt();
        }
        for (int i = 0; i < 5; ++i) {
            c[i] = sc.nextInt();
        }
        for (int i = 0; i < 5; ++i) {
            d[i] = sc.nextInt();
        }

        int op = 0, idx1 = 0, idx2 = 0;

        while (idx1 < 5 && idx2 < 5) {
            if (op % 2 == 0) {
                d[idx2] -= a[idx1];
                if (d[idx2] <= 0) {
                    idx2++;
                }
            } else {
                b[idx1] -= c[idx2];
                if (b[idx1] <= 0) {
                    idx1++;
                }
            }
            op++;
        }

        if (idx1 < 5) {
            int ans = 5 - idx1;
            System.out.println("win");
            System.out.println(ans);
        } else {
            int ans = 5 - idx2;
            System.out.println("lose");
            System.out.println(ans);
        }
        
        sc.close();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def main():
    a = [int(input()) for _ in range(5)]
    b = [int(input()) for _ in range(5)]
    c = [int(input()) for _ in range(5)]
    d = [int(input()) for _ in range(5)]

    op = 0
    idx1 = 0
    idx2 = 0

    while idx1 < 5 and idx2 < 5:
        if op % 2 == 0:
            d[idx2] -= a[idx1]
            if d[idx2] <= 0:
                idx2 += 1
        else:
            b[idx1] -= c[idx2]
            if b[idx1] <= 0:
                idx1 += 1
        op += 1

    if idx1 < 5:
        ans = 5 - idx1
        print("win")
        print(ans)
    else:
        ans = 5 - idx2
        print("lose")
        print(ans)

if __name__ == "__main__":
    main()

第二题

题目

小易正在《明日之后》中建造自己的庄园,已知建筑材料共有石灰、砂岩、花岗岩这三种,现在给定了每个建筑这三种材料的消耗,以及该建筑可以带来的收益值。小易初始有A单位石灰,B单位砂岩,C单位花岗岩。他想知道,自己获得的收益最大值为多少?每个建筑只能最多建一个。

输入描述

第一行包含四个正整数 ( n, A, B, C ),分别代表建筑种类数量以及小易初始的石灰、砂岩、花岗岩的单位数量。接下来的 ( n ) 行,每行包含四个整数 ( a_i, b_i, c_i, u_i ),分别代表每种建筑对应的石灰消耗、砂岩消耗、花岗岩消耗,以及该建筑带来的收益。

1<=A,B,C<=50

1<=ai,bi,ci,vi<=10^9

其中30%数据满足n<=20

输出描述

输出一个整数,代表最大收益。

参考题解

动态规划,这个问题是一个典型的背包问题变种,具体是一个多维的背包问题,即“多维费用背包问题”。我们需要考虑三种资源:石灰、砂岩和花岗岩作为限制条件,每种建筑的建造都会消耗一定数量的这三种资源,并且带来一定的收益。

初始化一个三维 DP 数组,大小为 ( (A+1) x (B+1) x (C+1) ),所有值设为 0。

对于每个建筑,更新 DP 数组。

最后DP[A][B][C]将存储使用所有资源的最大收益。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 55;

long long f[N][N][N];

int main()
{
    int n, A, B, C;
    cin >> n >> A >> B >> C;

 

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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论
我焯,前几天笔试的原题!
1 回复 分享
发布于 2024-07-15 01:50 陕西
为什么偏移1010
点赞 回复 分享
发布于 2024-06-30 16:33 上海

相关推荐

我是985研究生,最近学校在组织开题,大家都在非常紧张地准备,但我一直进入不了状态,很想做但是心又很浮躁。但我的室友们感觉都非常认真,每天醒来就开始看论文,睡着前最后一件事还是在看论文,我非常焦虑。我感觉自己甚至有点把大家当做假想敌了。这种比较心态还存在于生活的各种方面:看到有钱的同学会非常羡慕,看到朋友圈里面环游世界的留学生同学也会羡慕,看到那些工作后有自己的钱而过上较为阔绰的生活的时候还是羡慕,就仿佛只有自己一个人在阴暗爬行。而且这些比较是每时每刻的,为了不比较,我已经关闭了朋友圈,但是每次偶尔刷一下还是会难受很久。我知道比较是偷走幸福的小偷,但我好像控制不了,感觉自己是一个偷窥别人生活的...
若怜君欢:担心开题搞砸了,幻想拥有别人的生活,本质上是因为自卑,楼主小时候大概率是留守儿童或者父母关系很紧张,导致楼主没有安全感、焦虑、内耗。 这样的情况最好的办法就是建立自信和降低期待,建立自信不是一蹴而就,而是循序渐进,比如告诉自己允许自己第一次没把事情做好,失败了能搞清楚其中缘由而不是全盘否定自己,失败不是终点,放弃才是;降低期待只要记住一句话即可,能伴随你一生的,只有经验和学识,所以你对事情的态度应该更多地去思考它是否能带来学识和经验的增长,而不是仅仅用短期的利益作为唯一期待。 人生不是一成不变的,它是可以迭代更新的,去归纳总结自身的不足并结合实际去改进,去尝试一些新的思路和方法,不要固执钻牛角尖,也不要反复横跳,为自己设立一个高度聚集的精神内核,内核之上可以去尝试一切有利于自己更好的方式 以上就是我个人对生活的理解,共勉
点赞 评论 收藏
分享
评论
7
25
分享

创作者周榜

更多
牛客网
牛客企业服务