2024-3-30 网易雷火笔试题题解(A~C)

一小时写了A~C 剩下两小时没调出D的 最后D还是0分

A

题目描述

网易在从两年前开始对司龄1,3,6,10年的员工发纪念积木,今年决定补发以前没有补发的积木,问还各个类型的积木需要多少个

输入描述:

第一行输入一个N (1<=N<=10000),表示雷火的员工数量。

接下来一行是N个整数(1<=司龄<=20),表示每个员工今年达到的司龄。

思路:

暴力特判前两年有没有发过那几个奖品

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

#define _for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
int cnt[4];
int main(void)
{
    int n;
    scanf("%d",&n);
    _for(i,1,n)
    {
        int x;
        scanf("%d",&x);
        if(x>=1) cnt[0]++;
        if(x>=3) cnt[1]++;
        if(x>=6) cnt[2]++;
        if(x>=10) cnt[3]++;
        if(x-1==1) cnt[0]--;
        if(x-1==3) cnt[1]--;
        if(x-1==6) cnt[2]--;
        if(x-1==10) cnt[3]--;
        if(x-2==1) cnt[0]--;
        if(x-2==3) cnt[1]--;
        if(x-2==6) cnt[2]--;
        if(x-2==10) cnt[3]--;
    }
    _for(i,0,3) printf("%d ",cnt[i]);
}

B:(O(NlogN)解法)

题目描述:

初始有一个长度为1的文本,我们可以采用Ctrl A全选文本,Ctrl S选中单个文本,Ctrl C复制文本,Ctrl V粘贴文本,问给n个k,对于每个k得到一个长度为k的文本至少需要多少次。

思路:

当我们得到一个长度为x的串后,我们可以通过该串全选一次,复制一次,然后粘贴若干次后,去更新其他值(该部分时间复杂度与欧拉常数有关,总体复杂度为O(nlogn)),也可以通过该数字,选中单个文本一次,复制一次,粘贴若干次,去更新其他值(由于更新条件是dp[r]-dp[l]>r-l+2,因此可以构造val[x]=dp[x]-x,因此,我们可以维护val[x]的最小值mn,当val[i]>mn+2时,我们可以将dp[i]更新为mn+2+i,由于对于数组每个元素,可以O(1)求解,该部分的时间复杂度为O(n))。综上,总体复杂度为O(n),(复杂度中与n表示数据范围)

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

#define _for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
const int lim=16384;
int dp[lim];
int val[lim];
inline void funct()
{
    memset(dp,1,sizeof(dp));
    dp[1]=0;
    int mn=1000000000;
    for(int i=1;i<lim;i++)
    {
        dp[i]=min(dp[i],mn+2+i);
        val[i]=dp[i]-i;
        mn=min(val[i],mn);
        for(int j=i+i,cnt=3;j<lim;j+=i,++cnt)
        {
            dp[j]=min(dp[i]+cnt,dp[j]);
        }
    }
}
int main(void)
{
    int T;
    scanf("%d",&T);
    funct();
    // _for(i,1,16) printf("%d: %d\n",i,dp[i]);
    while(T--)
    {
        int x;
        scanf("%d",&x);
        printf("%d\n",dp[x]);
    }
}

C

题目简述:

有一个战斗力为p的玩家,以及一个n个怪物(怪物按战斗力正序输入),m个BOSS,可以耗费1cost,击败一个战斗力小于自己的非BOSS怪物,然后获得该怪物的战斗力,也可以耗费1cost,使得自己的战斗加上p/10,问,对于每个BOSS,如果需要击败该BOSS,需要消耗几cost

思路:

将能打过的所有怪物存入优先队列中,每次战斗力更新后,是否有新增可打败怪物,倘若有则更新可以战胜怪物列表。给BOSS存入优先队列(小根堆)中,当队列顶的BOSS不能打败时,考虑如何提升战斗力,为了使提升的战斗力最大化,我们可以看可战胜怪物中战斗力最高的怪物与p/10谁大,去决定打怪物还是让自己战斗加上p/10。直到所有BOSS的结果都计算出为止

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;

#define _for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

#define MAXN 100050
int monster[MAXN];
int ans[MAXN];
class node
{
public:
    int request,id,ans;
    node(int _request,int _id)
    {
        request=_request;
        id=_id;
        ans=0;
    }
    bool operator <(const node& b)const&
    {
        return b.request<request;
    }
};
priority_queue<node> BOSS_queue;
priority_queue<int> monster_queue;
int p,n,m;
inline void update_monster_queue(int &place,int x)
{
    for(place;place<=n&&monster[place]<x;place++)
    {
        monster_queue.push(monster[place]);
    }
}
int main(void)
{
    scanf("%d%d%d",&p,&n,&m);
    
    _for(i,1,n)
    {
        scanf("%d",&monster[i]);
    }
    _for(i,1,m)
    {
        int x;
        scanf("%d",&x);
        BOSS_queue.push(node(x+1,i));
    }
    int place=1;
    int cnt=0;
    update_monster_queue(place,p);
    while(!BOSS_queue.empty())
    {
        node now_BOSS=BOSS_queue.top();
        printf("%d %d\n",now_BOSS.id,now_BOSS.request);
        while(p<now_BOSS.request)
        {
            ++cnt;
            if(!monster_queue.empty()&&monster_queue.top()>p/10)
            {
                p+=monster_queue.top();
                monster_queue.pop();
            }
            else
            {
                p+=p/10;
            }
            update_monster_queue(place,p);
        }
        ans[now_BOSS.id]=cnt;
        BOSS_queue.pop();
    }
    _for(i,1,m)
    {
        printf("%d\n",ans[i]);
    }
}

全部评论
之前做鹰角的笔试就试着写过大模拟,非常恶心,今天看见雷火的大模拟直接关了太烦了
3 回复 分享
发布于 03-30 17:55 北京
D没看题就交了,,大模拟好恶心的
1 回复 分享
发布于 03-30 17:43 陕西
感觉写D有种写猪国杀的感觉(
点赞 回复 分享
发布于 03-30 17:33 湖南
佬,请问三个小时的笔试 就只有4个算法题嘛
点赞 回复 分享
发布于 04-26 12:54 山东

相关推荐

面试1面试官项目的概括介绍ArrayList与LinkedList的区别两者的内存空间是如何的(在头尾插入删除操作上)说一下HashMap中的哈希冲突hashcode()如何计算的稍微介绍一下HashMap底层的数据结构是(答了红黑树,然后开始拷打红黑树了)什么是红黑树数据结构,特点是什么插入删除的时间复杂度是多少给你三个节点,红黑树是什么样的(三黑,没答出来)说一下堆的数据结构是,最大堆最小堆堆排序的时间复杂度是(建堆是O(n),排序是O(nlogn))解释一下堆排序为什么是这个时间复杂度(发疯了,不知道ww,后续经查:在正式排序时,第n次取堆顶记录重建堆需要用O(logn)的时间,并且需要取n-1次堆顶记录,因此排序的时间复杂度是O(nlogn))问堆除了做排序还能做什么,看我不解,面试官提示我PriorityQueue(优先级队列我比较熟悉,就将了有无参构造,扩容机制,定时任务的原理,用堆实现定时任务(时间化为时间戳整数,堆要加锁保证线程安全等等))2面试官redis的跳表(一紧张忘记了,鼠鼠真的太菜了)问我熟不熟悉Linux系统(不熟悉,只熟悉操作命令),然后问了iptabels的作用,实际上遇到的场景系统调用kafka吞吐量大,为什么(发送缓冲区,按批发送)zookeeper在kafka中的作用是什么介绍一下ZAB协议zookeeper中的临时节点是什么(开扯)zookeeper中服务器的数量是单数还是双数将一下http和https的区别(开始上难度了)你自己开发使用的http是哪个版本(平时还是使用https多)那介绍一下tls的加密方式现在https默认使用的是那个tls版本和ssl版本(tls是1.3,ssl不知道)tls1.3相较于1.2的区别在哪(开扯,从安全性和加密速度上分析)问了清不清楚Nagle(没听说过>_还问了另一个没听说的算法反问问网易对于校招生更注重什么能力:相比疫情前,他们的招人的难度增大,侧重底层算法其他反问忘记了【网易游戏(互娱)】2025届校招N星计划开启投递!!面向对象:2024年9月-2025年8月毕业的同学工作地点:广州、杭州、上海网申时间:即日起,招满即止投递传送门:https://game.campus.163.com/m/position/21?st=ZTkxYTUwNWYtN2VjZC00NWNmLWFlOWYtZjAzYzZmOWI1OTQ0请认准我的内推码:【JC2tAF】项目重点一览:★掉落直通校招和实习两种offer,满足不同诉求!★实习项目未能斩获offer的同学可复活再战!★更快的校招流程,先人一步拿下offer!★五大岗位类别,多款游戏产品等你加盟!★业内具有竞争力的薪酬,幸福猪仔不是梦!欢迎具备无界精神的你,和我们一起创造未来的无限可能性!使用内推码简历优先筛选,有任何问题包括进度查询可以私信我,内推后在评论区留言【姓名缩写+岗位】,方便捞人和确认投递状态
网易互娱
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
14 38 评论
分享
牛客网
牛客企业服务